Submission #1316404

#TimeUsernameProblemLanguageResultExecution timeMemory
1316404AgageldiWall (IOI14_wall)C++20
61 / 100
287 ms11588 KiB
#include "bits/stdc++.h"
#include "wall.h"
// #include "grader.cpp"
using namespace std;

#define N 500005

int D[N], U[N], finalH[N];

void combine(int l,int r,int ind) {
  if(l == r) return;
  D[ind * 2] = min(D[ind * 2], D[ind]);
  D[ind * 2] = max(D[ind * 2], U[ind]);
  U[ind * 2] = min(U[ind * 2], D[ind]);
  U[ind * 2] = max(U[ind * 2], U[ind]);
  D[ind * 2 + 1] = min(D[ind * 2 + 1], D[ind]);
  D[ind * 2 + 1] = max(D[ind * 2 + 1], U[ind]);
  U[ind * 2 + 1] = min(U[ind * 2 + 1], D[ind]);
  U[ind * 2 + 1] = max(U[ind * 2 + 1], U[ind]);
  U[ind] = INT_MIN;
  D[ind] = INT_MAX;
  return;
}
void upd(int l,int r,int ind,int tp, int x,int y,int vl) {
  if(r < x || l > y) return;
  combine(l, r, ind);
  if(l >= x && r <= y) {
    if(tp == 1){
      U[ind] = max(U[ind], vl);
      D[ind] = max(D[ind], vl);
    }
    else {
      U[ind] = min(U[ind], vl);
      D[ind] = min(D[ind], vl);
    }
    return;
  }
  int mid = (l + r) / 2;
  upd(l, mid, ind * 2, tp, x, y, vl);
  upd(mid + 1, r, ind * 2 + 1, tp, x, y, vl);

}
void build(int l,int r,int ind) {
  if(l == r) {
    // cout << l << " " << U[ind] << " " << D[ind] << '\n';
    finalH[l] = min(U[ind], D[ind]);
    return;
  }
  combine(l, r, ind);
  int mid = (l + r) / 2;
  build(l,mid,ind*2);
  build(mid+1,r,ind*2+1);
}

void buildWall(int n, int k, int op[], int left[], int right[], int height[], int finalHeight[]){
  for(int i = 0; i < k; i++) {
    upd(1, n, 1, op[i], left[i] + 1, right[i] + 1, height[i]);
  }
  build(1, n, 1);
  for(int i = 0; i < n; i++) {
    finalHeight[i] = finalH[i + 1];
  }
  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...