이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define pii pair<int, int>
#define pll pair<ll, ll>
#define ff first
#define ss second
#define pb push_back
#define SZ(x) ((int)(x).size())
#define all(x) x.begin(), x.end()
#define debug(x) cout << #x << ": " << x << " "
#define nl cout << "\n"
#define rep(i, a, b) for(int i = (a); i <= (b); i++)
#define per(i, a, b) for(int i = (a); i >= (b); i--)
mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());
struct Node{
    int mn = 0, mx = INT_MAX;
    int lazy = -1;
};
int *ans;
class SegmentTree{
public:
    vector<Node> st;
    void build(int n){
        st = vector<Node>(4 * n);
    }
    void push(int i){
        int cl = 2 * i + 1, cr = 2 * i + 2;
        if(st[i].lazy == 0){
            st[cl].mn = max(st[cl].mn, st[i].mn);
            st[cl].mx = max(st[cl].mx, st[i].mn);
            st[cl].mn = min(st[cl].mn, st[i].mx);
            st[cl].mx = min(st[cl].mx, st[i].mx);
            st[cl].lazy = st[i].lazy;
            st[cr].mn = max(st[cr].mn, st[i].mn);
            st[cr].mx = max(st[cr].mx, st[i].mn);
            st[cr].mn = min(st[cr].mn, st[i].mx);
            st[cr].mx = min(st[cr].mx, st[i].mx);
            st[cr].lazy = st[i].lazy;
        }
        st[i].mn = 0, st[i].mx = INT_MAX, st[i].lazy = -1;
    }
    void add(int i, int l, int r, int ql, int qr, int op, int k){
        if(ql <= l && r <= qr){
            if(op == 0){
                st[i].mn = max(st[i].mn, k);
                st[i].mx = max(st[i].mx, k);
            } else if(op == 1){
                st[i].mn = min(st[i].mn, k);
                st[i].mx = min(st[i].mx, k);
            }
            st[i].lazy = 0;
            return;
        }
        if(qr < l || ql > r){
            return;
        }
        push(i);
        int m = (l + r) / 2;
        add(2 * i + 1, l, m, ql, qr, op, k);
        add(2 * i + 2, m + 1, r, ql, qr, op, k);
    }
    void dfs(int i, int l, int r){
        if(l == r) ans[l] = st[i].mn;
        else{
            push(i);
            int m = (l + r) / 2;
            dfs(2 * i + 1, l, m);
            dfs(2 * i + 2, m + 1, r);
        }
    }
} st;
void buildWall(int N, int K, int op[], int left[], int right[], int height[], int ans[]){
    st.build(N);
    rep(i, 0, K){
        --op[i]; st.add(0, 0, N - 1, left[i], right[i], op[i], height[i]);
    }
    ::ans = ans;
    st.dfs(0, 0, N - 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... |