Submission #272746

#TimeUsernameProblemLanguageResultExecution timeMemory
272746toonewbieWall (IOI14_wall)C++17
100 / 100
1292 ms69780 KiB
#include "wall.h"
#include <bits/stdc++.h>

using namespace std;

const int INF = 2000000000;
const int maxx = 2000005;

#define mn first
#define mx second

pair <int, int> t[maxx << 2];

void relax(int v, int l, int r) {
    if (l != r) {
        int lc = v << 1, rc = v << 1 | 1;
        t[lc] = {max(min(t[lc].mn, t[v].mn), t[v].mx), max(min(t[lc].mx, t[v].mn), t[v].mx)};
        t[rc] = {max(min(t[rc].mn, t[v].mn), t[v].mx), max(min(t[rc].mx, t[v].mn), t[v].mx)};
    }
}

void update(int v, int l, int r, int i, int j, int val, int oq) {
    relax(v, l, r);
    if (i > r || j < l) {
        return;
    }
    if (i <= l && r <= j) {
        if (oq == 1) {
            t[v].mn = max(t[v].mn, val);
            t[v].mx = max(t[v].mx, val);
        } else {
            t[v].mn = min(t[v].mn, val);
            t[v].mx = min(t[v].mx, val);
        }
        return;
    }
    t[v].mn = INF, t[v].mx = -INF;
    int mid = (l + r) >> 1;
    update(v << 1, l, mid, i, j, val, oq);
    update(v << 1 | 1, mid + 1, r, i, j, val, oq);
}
int query(int v, int l, int r, int i) {
    relax(v, l, r);
    if (l == r) {
        return t[v].mn;
    }
    int mid = (l + r) >> 1;
    if (i <= mid) {
        return query(v << 1, l, mid, i);
    } else {
        return query(v << 1 | 1, mid + 1, r, i);
    }
}

void buildWall(int n, int k, int op[], int left[], int right[], int height[], int finalHeight[]){
    for (int i = 0; i < k; i++) {
        update(1, 1, n, left[i] + 1, right[i] + 1, height[i], op[i]);
    }
    for (int i = 1; i <= n; i++) {
        finalHeight[i - 1] = query(1, 1, n, i);
    }
    return;
}

#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...