Submission #1342172

#TimeUsernameProblemLanguageResultExecution timeMemory
1342172PakinDioxide벽 (IOI14_wall)C++17
100 / 100
732 ms105424 KiB
#include "wall.h"
#include <bits/stdc++.h>
#define ll long long

using namespace std;

const int mxN = 2e6+5;

int seg[4*mxN], L[4*mxN], R[4*mxN];

void push(int u) {
    seg[u<<1] = max(seg[u<<1], L[u]);
    seg[u<<1] = min(seg[u<<1], R[u]);
    L[u<<1] = max(L[u<<1], L[u]);
    L[u<<1] = min(L[u<<1], R[u]);
    R[u<<1] = min(R[u<<1], R[u]);
    R[u<<1] = max(R[u<<1], L[u]);
    seg[u<<1|1] = max(seg[u<<1|1], L[u]);
    seg[u<<1|1] = min(seg[u<<1|1], R[u]);
    L[u<<1|1] = max(L[u<<1|1], L[u]);
    L[u<<1|1] = min(L[u<<1|1], R[u]);
    R[u<<1|1] = min(R[u<<1|1], R[u]);
    R[u<<1|1] = max(R[u<<1|1], L[u]);
    L[u] = INT_MIN, R[u] = INT_MAX;
}

void upd(int l, int r, int x, int y, int Lx, int Rx, int u) {
    if (x <= l && r <= y) {
        seg[u] = max(Lx, seg[u]);
        seg[u] = min(Rx, seg[u]);
        L[u] = max(L[u], Lx);
        L[u] = min(L[u], Rx);
        R[u] = min(R[u], Rx);
        R[u] = max(R[u], Lx);
    } else {
        push(u);
        int m = l + (r-l)/2;
        if (m >= x) upd(l, m, x, y, Lx, Rx, u<<1);
        if (m+1 <= y) upd(m+1, r, x, y, Lx, Rx, u<<1|1);
    }
}

int qr(int l, int r, int x, int u) {
    if (l == r) return seg[u];
    else {
        push(u);
        int m = l + (r-l)/2;
        if (m >= x) return qr(l, m, x, u<<1);
        else return qr(m+1, r, x, u<<1|1);
    }
}

void buildWall(int n, int k, int op[], int left[], int right[], int height[], int finalHeight[]){
    for (auto &e : L) e = INT_MIN;
    for (auto &e : R) e = INT_MAX;
    for (int i = 0; i < k; i++) {
        if (op[i] == 1) upd(0, n-1, left[i], right[i], height[i], INT_MAX, 1);
        else upd(0, n-1, left[i], right[i], INT_MIN, height[i], 1);
    }
    for (int i = 0; i < n; i++) finalHeight[i] = qr(0, n-1, 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...