Submission #1209300

#TimeUsernameProblemLanguageResultExecution timeMemory
1209300GabrielWall (IOI14_wall)C++17
100 / 100
990 ms96824 KiB
#include "wall.h"
#include "bits/stdc++.h"
using namespace std;
struct Nodo{
  int Menor, Mayor;
};
vector<int> a;
vector<Nodo> Propagable;
Nodo Nada;
void Propagar(int i, int d, int p){
  Nodo Actual = Propagable[p];
  if(p * 2 < Propagable.size()){
    Nodo Hijo = Propagable[p * 2];
    if(Actual.Mayor < Hijo.Menor){
      Hijo.Menor = Actual.Mayor;
      Hijo.Mayor = Actual.Mayor;
    } else if(Actual.Menor > Hijo.Mayor){
      Hijo.Mayor = Actual.Menor;
      Hijo.Menor = Actual.Menor;
    } else {
      Hijo.Mayor = min(Hijo.Mayor, Actual.Mayor);
      Hijo.Menor = max(Hijo.Menor, Actual.Menor);
    }
    Propagable[p * 2] = Hijo;
  }
  if(p * 2 + 1 < Propagable.size()){
    Nodo Hijo = Propagable[p * 2 + 1];
    if(Actual.Mayor < Hijo.Menor){
      Hijo.Menor = Actual.Mayor;
      Hijo.Mayor = Actual.Mayor;
    } else if(Actual.Menor > Hijo.Mayor){
      Hijo.Mayor = Actual.Menor;
      Hijo.Menor = Actual.Menor;
    } else {
      Hijo.Mayor = min(Hijo.Mayor, Actual.Mayor);
      Hijo.Menor = max(Hijo.Menor, Actual.Menor);
    }
    Propagable[p * 2 + 1] = Hijo;
  }
  if(i == d){
    if(a[i] > Actual.Mayor) a[i] = Actual.Mayor;
    else if(a[i] < Actual.Menor) a[i] = Actual.Menor;
  }
  Propagable[p] = Nada;
}
void A_adir(int i, int d, int p, int I, int D, int v){
  Propagar(i, d, p);
  if(i >= I and d <= D){
    Propagable[p].Menor = v;
    return;
  }
  if(i > D or d < I) return;
  int P = (i + d) / 2;
  A_adir(i, P, p * 2, I, D, v);
  A_adir(P + 1, d, p * 2 + 1, I, D, v);
}
void Quitar(int i, int d, int p, int I, int D, int v){
  Propagar(i, d, p);
  if(i >= I and d <= D){
    Propagable[p].Mayor = v;
    return;
  }
  if(i > D or d < I) return;
  int P = (i + d) / 2;
  Quitar(i, P, p * 2, I, D, v);
  Quitar(P + 1, d, p * 2 + 1, I, D, v);
}
void buildWall(int n, int k, int op[], int left[], int right[], int height[], int finalHeight[]){
  Nada.Menor = 0;
  Nada.Mayor = 1e5;
  Propagable.assign(n * 4 + 22, Nada);
  a.assign(n, 0);
  for(int i = 0; i < k; i++){
    if(op[i] == 1) A_adir(0, n - 1, 1, left[i], right[i], height[i]);
    else Quitar(0, n - 1, 1, left[i], right[i], height[i]);
  }  
  for(int i = 0; i < n; i++) A_adir(0, n - 1, 1, i, i, 0);
  for(int i = 0; i < n; i++) finalHeight[i] = a[i];
  return;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...