Submission #1232857

#TimeUsernameProblemLanguageResultExecution timeMemory
1232857LucaIlieWall (IOI14_wall)C++20
0 / 100
252 ms114440 KiB
#include "wall.h"
#include <bits/stdc++.h>

using namespace std;

struct upd {
    int l, r;
};

const int MAX_N = 2e6;
const int INF = 1e9;
vector<int> updatesByL[MAX_N], updatesByR[MAX_N];
upd segTree[4 * MAX_N];

void update(int v, int l, int r, int p, upd x) {
    if (p > r || p < l)
        return;

    if (l == r) {
        segTree[v] = x;
        return;
    }

    int mid = (l + r) / 2;
    update(v * 2 + 1, l, mid, p, x);
    update(v * 2 + 2, mid + 1, r, p, x);

    upd a = segTree[v * 2 + 1];
    upd b = segTree[v * 2 + 2];

    upd ans;

    ans.l = min(max(a.l, b.l), b.r);
    ans.r = min(max(a.r, b.l), b.r);
    // printf("aint %d %d -> %d %d %d\n", l, r, a.l, a.r, a.k);

    segTree[v] = ans;
}

upd queryAll() {
    return segTree[0];
}

void buildWall(int n, int q, int op[], int left[], int right[], int height[], int finalHeight[]){
    for (int v = 0; v < 4 * n; v++)
        segTree[v] = {0, INF};
    for (int i = 0; i < q; i++) {
        updatesByL[left[i]].push_back(i);
        updatesByR[right[i]].push_back(i);
    }

    for (int i = 0; i < n; i++) {
        for (int j: updatesByL[i]) {
            upd u;
            if (op[j] == 1)
                u = {height[j], INF};
            else
                u = {0, height[j]};
            // printf("apare %d %d\n", op[j], height[j]);
            update(0, 0, q - 1, j, u);
        }

        finalHeight[i] = queryAll().l;
        // printf("query %d\n", i);

        for (int j: updatesByR[i]) {
            update(0, 0, q - 1, j, {0, INF});
            // printf("dispare %d %d\n", op[j], height[j]);
        }
    }
}

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