# | Time | Username | Problem | Language | Result | Execution time | Memory |
---|---|---|---|---|---|---|---|
492528 | nadorb | Wall (IOI14_wall) | C++14 | 0 ms | 0 KiB |
This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#include <bits/stdc++.h>
using namespace std;
int mn[8000001], mx[8000001];
void update(int v, int ql, int qr, int vl, int vr, int val, int sgn){
if(ql > vr || qr < vl){
return;
}
if(vl <= ql && qr <= vr){
if(sgn == 2){
mn[v] = min(mn[v], val);
mx[v] = min(mx[v], val);
}
else{
mn[v] = max(mx[v], val);
mx[v] = max(mn[v], val);
}
return;
}
if(sgn == 2){
val = max(val, mn[v]);
}
else val = min(val, mx[v]);
int mid = (vl + vr) / 2;
update(2 * v, ql, min(qr, mid), vl, mid, val, sgn);
update(2 * v + 1, max(ql, mid + 1), qr, mid + 1, vr, val, sgn);
}
int l[8000001], r[8000001];
void buildWall(int n, int k, int op[], int left[], int right[], int height, int finalHeight[]){
for(int i = 0; i <= 8000000; i++){
mx[i] = 100001;
}
for(int i = 0; i < k; i++){
update(1, left[i], right[i], 1, n, height, op[i]);
}
l[1] = 1, r[1] = n;
for(int v = 1; v <= 8000000; v++){
if(2 * v <= 8000000){
mn[2 * v] = max(mn[v], mn[2 * v]);
mx[2 * v] = min(mx[v], mx[2 * v]);
}
if(2 * v + 1 <= 8000000){
mn[2 * v + 1] = max(mn[v], mn[2 * v + 1]);
mx[2 * v + 1] = min(mx[v], mx[2 * v + 1]);
}
if(v % 2 == 0){
l[v] = l[v / 2];
r[v] = (l[v / 2] + r[v / 2]) / 2;
}
else{
l[v] = (l[v / 2] + r[v / 2]) / 2 + 1;
r[v] = r[v / 2];
}
if(l[v] == r[v]){
finalHeight[l[v]] = mn[v];
}
}
}