Submission #697944

#TimeUsernameProblemLanguageResultExecution timeMemory
697944BhavayGoyalWall (IOI14_wall)C++14
100 / 100
897 ms65588 KiB
#include <bits/stdc++.h>
#include <wall.h>
using namespace std;

#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
using namespace __gnu_pbds;

template<class T> using oset = 
            tree<T, null_type, less<T>, rb_tree_tag, tree_order_statistics_node_update>;

#define ll long long
#define ld long double
#define ar array
#define vi vector<int>
#define vii vector<vector<int>>
#define pii pair<int, int>
#define pb push_back
#define all(x) x.begin(), x.end()
#define f first
#define s second
#define endl "\n"

const int MOD = 1e9+7;
const int inf = 1e9;
const ll linf = 1e18;

const int d4i[4]={-1, 0, 1, 0}, d4j[4]={0, 1, 0, -1};
const int d8i[8]={-1, -1, 0, 1, 1, 1, 0, -1}, d8j[8]={0, 1, 1, 1, 0, -1, -1, -1};


// -------------------------------------------------- Main Code --------------------------------------------------

struct Node {
    int val, mn, mx; // final value, last was delete oper, last was add oper
};

struct segTree {
    int n;
    vector<Node> tree;

    segTree(int N) {n = 1; while (n < N) n *= 2; tree = vector<Node>(2*n+2, {0, inf, -1});}

    void propogate(int node, int left, int right) {
        if (tree[node].mn == inf && tree[node].mx == -1) return;

        if (tree[node].mn != inf) {
            tree[node].val = min(tree[node].val, tree[node].mn);
            if (left != right) {
                tree[node*2].mx = min(tree[node].mn, tree[node*2].mx);
                tree[node*2].mn = min(tree[node].mn, tree[node*2].mn);
                tree[node*2+1].mx = min(tree[node].mn, tree[node*2+1].mx);
                tree[node*2+1].mn = min(tree[node].mn, tree[node*2+1].mn);
            }
            tree[node].mn = inf;
        }
        if (tree[node].mx != -1) {
            tree[node].val = max(tree[node].val, tree[node].mx);
            if (left != right) {
                tree[node*2].mn = max(tree[node].mx, tree[node*2].mn);
                tree[node*2].mx = max(tree[node].mx, tree[node*2].mx);
                tree[node*2+1].mn = max(tree[node].mx, tree[node*2+1].mn);
                tree[node*2+1].mx = max(tree[node].mx, tree[node*2+1].mx);
            }
            tree[node].mx = -1;
        }
    }

    void update(int node, int left, int right, int l, int r, int val, int type) {
        propogate(node, left, right);
        if (left > r || right < l) return;
        else if (left >= l && right <= r) {
            if (type == 1) {
                // add operation
                tree[node].mn = inf;
                tree[node].mx = val;
            }
            else {
                // delete operation
                tree[node].mn = val;
                tree[node].mx = -1;
            }
            propogate(node, left, right);
            return;
        }
        update(node*2, left, (left+right)/2, l, r, val, type);
        update(node*2+1, (left+right)/2+1, right, l, r, val, type);
    }
    void update(int l, int r, int val, int type) {update(1, 1, n, l, r, val, type);}

    int query(int node, int left, int right, int idx) {
        propogate(node, left, right);
        if (left == right) {
            return tree[node].val;
        }
        int mid = (left+right)/2;
        if (idx <= mid) return query(node*2, left, (left+right)/2, idx);
        else return query(node*2+1, (left+right)/2+1, right, idx);
    }
    int query(int idx) {return query(1, 1, n, idx);}
};

void buildWall(int n, int k, int op[], int left[], int right[], int height[], int finalHeight[]) {
    segTree tree(n);
    for (int i = 0; i < k; i++) tree.update(left[i]+1, right[i]+1, height[i], op[i]);
    for (int i = 0; i < n; i++) finalHeight[i] = tree.query(i+1);
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...