#include "wall.h"
#include <bits/stdc++.h>
using namespace std;
// #define int long long
#define all(x) x.begin(), x.end()
#define pb push_back
#define ar array
#define nl '\n'
template <typename A, typename B>
bool chmin(A &a, const B &b) {
if(a > b) {
return a = b, true;
}
return false;
}
template <typename A, typename B>
bool chmax(A &a, const B &b) {
if(a < b) {
return a = b, true;
}
return false;
}
const int inf = 1e9 + 5;
struct node {
int mn, mx, pmn, pmx;
node() : mn(inf), mx(-inf), pmn(inf), pmx(-inf) {}
node(int x) : mn(x), mx(x), pmn(inf), pmx(-inf) {}
void merge(node &l, node &r) {
mn = min(l.mn, r.mn);
mx = max(l.mx, r.mx);
}
};
struct segtree {
int n; vector<node> t;
segtree(vector<int> a) : n(a.size()), t(n << 2) {
build(1, 1, n, a);
}
void build(int v, int l, int r, vector<int> &a) {
if(l == r) {
t[v] = node(a[l - 1]);
return;
}
int m = (l + r) >> 1;
build(v << 1, l, m, a);
build(v << 1 | 1, m + 1, r, a);
t[v].merge(t[v << 1], t[v << 1 | 1]);
}
void push(int v, int l, int r) {
if(t[v].mn >= t[v].pmn) {
chmin(t[v].mn, t[v].pmn);
chmin(t[v].mx, t[v].pmn);
if(l != r) {
chmin(t[v << 1].pmn, t[v].pmn);
chmin(t[v << 1 | 1].pmn, t[v].pmn);
}
t[v].pmn = inf;
}
if(t[v].mx <= t[v].pmx) {
chmax(t[v].mn, t[v].pmx);
chmax(t[v].mx, t[v].pmx);
if(l != r) {
chmax(t[v << 1].pmx, t[v].pmx);
chmax(t[v << 1 | 1].pmx, t[v].pmx);
}
t[v].pmx = -inf;
}
}
void setmin(int v, int l, int r, int ll, int rr, int x) {
push(v, l, r);
if(l > rr || ll > r || t[v].mx <= x) return;
if(l >= ll && r <= rr && t[v].mn >= x) {
t[v].pmn = x;
push(v, l, r);
return;
}
int m = (l + r) >> 1;
setmin(v << 1, l, m, ll, rr, x);
setmin(v << 1 | 1, m + 1, r, ll, rr, x);
t[v].merge(t[v << 1], t[v << 1 | 1]);
}
void setmin(int l, int r, int x) {
setmin(1, 1, n, l, r, x);
}
void setmax(int v, int l, int r, int ll, int rr, int x) {
push(v, l, r);
if(l > rr || ll > r || t[v].mn >= x) return;
if(l >= ll && r <= rr && t[v].mx <= x) {
t[v].pmx = x;
push(v, l, r);
return;
}
int m = (l + r) >> 1;
setmax(v << 1, l, m, ll, rr, x);
setmax(v << 1 | 1, m + 1, r, ll, rr, x);
t[v].merge(t[v << 1], t[v << 1 | 1]);
}
void setmax(int l, int r, int x) {
setmax(1, 1, n, l, r, x);
}
int get(int v, int l, int r, int i) {
push(v, l, r);
if(l == r) return t[v].mn;
int m = (l + r) >> 1;
if(i <= m) return get(v << 1, l, m, i);
return get(v << 1 | 1, m + 1, r, i);
}
int get(int i) {
return get(1, 1, n, i);
}
};
void buildWall(int n, int k, int op[], int left[], int right[], int height[], int finalHeight[]){
vector<int> a(n);
segtree t(a);
for(int i = 0; i < k; i++) {
// cout << "Query ";
if(op[i] == 1) {
// cout << "setmax: " << left[i] + 1 << ' ' << right[i] + 1 << ' ' << height[i] << endl;
t.setmax(left[i] + 1, right[i] + 1, height[i]);
} else {
// cout << "setmin: " << left[i] + 1 << ' ' << right[i] + 1 << ' ' << height[i] << endl;
t.setmin(left[i] + 1, right[i] + 1, height[i]);
}
// for(int j = 0; j < n; j++) {
// cout << t.get(j + 1) << ' ';
// }
// cout << nl;
}
for(int i = 0; i < n; i++) {
finalHeight[i] = t.get(i + 1);
}
}
# | 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... |