# | Time | Username | Problem | Language | Result | Execution time | Memory |
---|
1121301 | | Irate | 벽 (IOI14_wall) | C++17 | | 796 ms | 161992 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;
/*
10 6
1 1 8 4
2 4 9 1
2 3 6 5
1 0 5 3
1 2 2 5
2 6 7 0
*/
struct Node{
int l = -1, r = -1;
};
Node intersect(Node &cur, Node &upd){
if(cur.l < 0){
return upd;
}
if(upd.l > cur.r){
return {upd.l, upd.l};
}
else if(cur.l > upd.r){
return {upd.r, upd.r};
}
else if(cur.l <= upd.l && upd.l <= cur.r && cur.r <= upd.r){
return {upd.l, cur.r};
}
else if(upd.l <= cur.l && cur.l <= upd.r && upd.r <= cur.r){
return {cur.l, upd.r};
}
else if(cur.l <= upd.l && upd.r <= cur.r){
return upd;
}
return cur;
}
struct SegmentTree{
vector<Node>sTree, lazy;
void init(int n){
sTree.resize(4 * n);
lazy.resize(4 * n);
}
void Propagate(int node, int l, int r){
if(lazy[node].l < 0)return;
if(l != r){
lazy[node * 2] = intersect(lazy[node * 2], lazy[node]);
lazy[node * 2 + 1] = intersect(lazy[node * 2 + 1], lazy[node]);
}
else{
sTree[node] = intersect(sTree[node], lazy[node]);
}
lazy[node] = {-1, -1};
}
void Build(int node, int l, int r){
if(l == r){
sTree[node] = {0, 0};
}
else{
int mid = (l + r) >> 1;
Build(node * 2, l, mid);
Build(node * 2 + 1, mid + 1, r);
}
}
void R_Update(int node, int l, int r, int ql, int qr, int type, int x){
Propagate(node, l, r);
if(ql <= l && r <= qr){
if(type == 2){
lazy[node] = {0, x};
}
else{
lazy[node] = {x, 100000};
}
Propagate(node, l, r);
return;
}
if(ql > r || l > qr){
return;
}
int mid = (l + r) >> 1;
R_Update(node * 2, l, mid, ql, qr, type, x);
R_Update(node * 2 + 1, mid + 1, r, ql, qr, type, x);
}
int Get(int node, int l, int r, int pos){
Propagate(node, l, r);
if(l == r){
return sTree[node].l;
}
else{
int mid = (l + r) >> 1;
if(pos <= mid){
return Get(node * 2, l, mid, pos);
}
else{
return Get(node * 2 + 1, mid + 1, r, pos);
}
}
}
} tree;
void buildWall(int n, int k, int op[], int left[], int right[], int height[], int finalHeight[]){
tree.init(n);
tree.Build(1, 1, n);
for(int i = 0;i < k;++i){
tree.R_Update(1, 1, n, left[i] + 1, right[i] + 1, op[i], height[i]);
}
for(int i = 1;i <= n;++i){
finalHeight[i - 1] = tree.Get(1, 1, n, i);
}
}
// int main(){
// ios_base::sync_with_stdio(0);
// cin.tie(0);
// int n, q;
// cin >> n >> q;
// int op[q], left[q], right[q], height[q], finalHeight[n];
// for(int i = 0;i < q;++i){
// cin >> op[i] >> left[i] >> right[i] >> height[i];
// }
// buildWall(n, q, op, left, right, height, finalHeight);
// }
# | 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... |