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;
typedef long long ll;
typedef vector<ll> vll;
typedef pair<ll, ll> pll;
class Tree {
public:
int mn, mx; // These are also the lazy parameters
bool marked_min, marked_max;
int l, r;
Tree* lt;
Tree* rt;
Tree(int a_l, int a_r): l(a_l), r(a_r), lt(nullptr), rt(nullptr), mn(0), mx(0), marked_min(false), marked_max(false) {};
void push() {
if(!marked_min && !marked_max) return;
if(l == r) {
marked_min = marked_max = false;
return;
}
if(marked_min) {
if(lt->mn < mn && mn < lt->mx) {
lt->mn = mn;
}
if(mn >= lt->mx) {
lt->mn = lt->mx = mn;
lt->marked_max = true; // ! TODO rethink this
}
lt->marked_min = true;
if(rt->mn < mn && mn < rt->mx) {
rt->mn = mn;
}
if(mn >= rt->mx) {
rt->mn = rt->mx = mn;
rt->marked_max = true;
}
rt->marked_min = true;
marked_min = false;
}
if(marked_max) {
if(lt->mn < mx && mx < lt->mx) {
lt->mx = mx;
}
if(mx <= lt->mn) {
lt->mn = lt->mx = mx;
lt->marked_min = true;
}
lt->marked_max = true;
if(rt->mn < mx && mx < rt->mx) {
rt->mx = mx;
}
if(mx <= rt->mn) {
rt->mn = rt->mx = mx;
rt->marked_min = true;
}
rt->marked_max = true;
marked_max = false;
}
}
void combine() {
mn = min(lt->mn, rt->mn);
mx = max(lt->mx, rt->mx);
}
void build() {
if(l == r) return;
int m = (l + r) >> 1;
lt = new Tree(l, m);
rt = new Tree(m + 1, r);
lt->build();
rt->build();
// I'd normally combine but there's no need to here :))
// Everything is zero, anyways
}
void set_min(int ql, int qr, int nmn) {
if(ql > r || qr < l) return;
push();
if(ql == l && qr == r) {
if(mn < nmn && nmn < mx) {
marked_min = true;
mn = nmn;
}
if(nmn >= mx) {
marked_min = true;
marked_max = true;
mn = mx = nmn;
}
push();
return;
}
int m = (l + r) >> 1;
lt->set_min(ql, min(qr, m), nmn);
rt->set_min(max(m + 1, ql), qr, nmn);
combine();
}
void set_max(int ql, int qr, int nmx) {
if(ql > r || qr < l) return;
push();
if(ql == l && qr == r) {
if(mn < nmx && nmx < mx) {
marked_max = true;
mx = nmx; // ! Ahahah, you were doing mn = nmx, be careful!
}
if(nmx <= mn) {
marked_min = true;
marked_max = true;
mn = mx = nmx;
}
push();
return;
}
int m = (l + r) >> 1;
lt->set_max(ql, min(qr, m), nmx);
rt->set_max(max(m + 1, ql), qr, nmx);
combine();
}
int query(int i) {
push();
if(l == r && r == i) {
assert(mn == mx);
return mn;
}
int m = (l + r) >> 1;
if(i <= m) return lt->query(i);
else return rt->query(i);
}
};
// IOI Function Signatures
void buildWall(int n, int k, int op[], int left[], int right[], int height[], int finalHeight[]) {
Tree tr(0, n - 1);
tr.build();
for(int i = 0; i < k; i++) {
if(op[i] == 1) {
// Add (set min)
tr.set_min(left[i], right[i], height[i]);
} else {
// Remove (set max)
tr.set_max(left[i], right[i], height[i]);
}
}
for(int i = 0; i < n; i++) {
finalHeight[i] = tr.query(i);
}
};
Compilation message (stderr)
wall.cpp: In constructor 'Tree::Tree(int, int)':
wall.cpp:13:15: warning: 'Tree::rt' will be initialized after [-Wreorder]
13 | Tree* rt;
| ^~
wall.cpp:9:13: warning: 'int Tree::mn' [-Wreorder]
9 | int mn, mx; // These are also the lazy parameters
| ^~
wall.cpp:15:9: warning: when initialized here [-Wreorder]
15 | Tree(int a_l, int a_r): l(a_l), r(a_r), lt(nullptr), rt(nullptr), mn(0), mx(0), marked_min(false), marked_max(false) {};
| ^~~~
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |