제출 #1350071

#제출 시각아이디문제언어결과실행 시간메모리
1350071bakhtiyarn벽 (IOI14_wall)C++20
0 / 100
55 ms8192 KiB
// GPT's code
#include <bits/stdc++.h>
using namespace std;

const int N = 2e5 + 5;

struct Node {
    int mn, mx;
    int s_mn, s_mx;
} st[N * 4];

int n;

Node merge(Node a, Node b) {
    Node res;

    res.mn = min(a.mn, b.mn);
    res.mx = max(a.mx, b.mx);

    // second min
    if (a.mn < b.mn) res.s_mn = min(b.mn, a.s_mn);
    else if (a.mn > b.mn) res.s_mn = min(a.mn, b.s_mn);
    else res.s_mn = min(a.s_mn, b.s_mn);

    // second max
    if (a.mx > b.mx) res.s_mx = max(b.mx, a.s_mx);
    else if (a.mx < b.mx) res.s_mx = max(a.mx, b.s_mx);
    else res.s_mx = max(a.s_mx, b.s_mx);

    return res;
}

void build(int u, int l, int r) {
    if (l == r) {
        st[u] = {0, 0, (int)1e9, -(int)1e9};
        return;
    }
    int mid = (l + r) >> 1;
    build(u<<1, l, mid);
    build(u<<1|1, mid+1, r);
    st[u] = merge(st[u<<1], st[u<<1|1]);
}

void push_chmin(int u, int x) {
    if (st[u].mx <= x) return;
    st[u].mx = x;
}

void push_chmax(int u, int x) {
    if (st[u].mn >= x) return;
    st[u].mn = x;
}

void push(int u) {
    push_chmin(u<<1, st[u].mx);
    push_chmin(u<<1|1, st[u].mx);

    push_chmax(u<<1, st[u].mn);
    push_chmax(u<<1|1, st[u].mn);
}

void pull(int u) {
    st[u] = merge(st[u<<1], st[u<<1|1]);
}

void range_chmin(int u, int l, int r, int ql, int qr, int x) {
    if (l > qr || r < ql || st[u].mx <= x) return;
    if (ql <= l && r <= qr && st[u].s_mx < x) {
        push_chmin(u, x);
        return;
    }
    push(u);
    int mid = (l + r) >> 1;
    range_chmin(u<<1, l, mid, ql, qr, x);
    range_chmin(u<<1|1, mid+1, r, ql, qr, x);
    pull(u);
}

void range_chmax(int u, int l, int r, int ql, int qr, int x) {
    if (l > qr || r < ql || st[u].mn >= x) return;
    if (ql <= l && r <= qr && st[u].s_mn > x) {
        push_chmax(u, x);
        return;
    }
    push(u);
    int mid = (l + r) >> 1;
    range_chmax(u<<1, l, mid, ql, qr, x);
    range_chmax(u<<1|1, mid+1, r, ql, qr, x);
    pull(u);
}

void get(int u, int l, int r, vector<int>& res) {
    if (l == r) {
        res[l] = st[u].mn;
        return;
    }
    push(u);
    int mid = (l + r) >> 1;
    get(u<<1, l, mid, res);
    get(u<<1|1, mid+1, r, res);
}

void buildWall(int n_, int k, int op[], int left[], int right[],
               int height[], int finalHeight[]) {

    n = n_;
    build(1, 0, n-1);

    for (int i = 0; i < k; i++) {
        if (op[i] == 1) {
            // add → chmax
            range_chmax(1, 0, n-1, left[i], right[i], height[i]);
        } else {
            // remove → chmin
            range_chmin(1, 0, n-1, left[i], right[i], height[i]);
        }
    }

    vector<int> res(n);
    get(1, 0, n-1, res);

    for (int i = 0; i < n; i++)
        finalHeight[i] = res[i];
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...