Submission #1121301

#TimeUsernameProblemLanguageResultExecution timeMemory
1121301IrateWall (IOI14_wall)C++17
100 / 100
796 ms161992 KiB
#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 timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...