Submission #1232883

#TimeUsernameProblemLanguageResultExecution timeMemory
1232883LucaIlieWall (IOI14_wall)C++20
100 / 100
534 ms88996 KiB
#include "wall.h"
#include <bits/stdc++.h>

using namespace std;

struct info {
    int l, r;
};

const int MAX_N = 2e6;
const int INF = 1e5;
info lazy[4 * MAX_N];

void propag(int v, int l, int r) {
    if (l == r)
        return;

    lazy[v * 2 + 1].l = min(lazy[v * 2 + 1].l, lazy[v].r);
    lazy[v * 2 + 1].l = max(lazy[v * 2 + 1].l, lazy[v].l);
    lazy[v * 2 + 1].r = min(lazy[v * 2 + 1].r, lazy[v].r);
    lazy[v * 2 + 1].r = max(lazy[v * 2 + 1].r, lazy[v].l);

    lazy[v * 2 + 2].l = min(lazy[v * 2 + 2].l, lazy[v].r);
    lazy[v * 2 + 2].l = max(lazy[v * 2 + 2].l, lazy[v].l);
    lazy[v * 2 + 2].r = min(lazy[v * 2 + 2].r, lazy[v].r);
    lazy[v * 2 + 2].r = max(lazy[v * 2 + 2].r, lazy[v].l);

    lazy[v] = {0, INF};
}

int timee = 0;
void update(int v, int l, int r, int lu, int ru, int t, int k) {
    propag(v, l, r);

    if (l > ru || r < lu)
        return;

    if (lu <= l && r <= ru) {
        if (t == 1) {
            lazy[v].l = max(lazy[v].l, k);
            lazy[v].r = max(lazy[v].r, k);
        } else {
            lazy[v].l = min(lazy[v].l, k);
            lazy[v].r = min(lazy[v].r, k);
        }
        propag(v, l, r);
        return;
    }

    int mid = (l + r) / 2;
    update(v * 2 + 1, l, mid, lu, ru, t, k);
    update(v * 2 + 2, mid + 1, r, lu, ru, t, k);
}

void getFinalHeight(int v, int l, int r, int finalHeight[]) {
    propag(v, l, r);

    // printf("%d %d -> %d %d\n", l, r, lazy[v].l, lazy[v].r);
    
    if (l == r) {
        finalHeight[l] = lazy[v].l;
        return;
    }

    int mid = (l + r) / 2;
    getFinalHeight(v * 2 + 1, l, mid, finalHeight);
    getFinalHeight(v * 2 + 2, mid + 1, r, finalHeight);
}

void buildWall(int n, int k, int op[], int left[], int right[], int height[], int finalHeight[]){
    for (int v = 0; v < 4 * n; v++)
        lazy[v] = {0, INF};

    for (int i = 0; i < k; i++)
        update(0, 0, n - 1, left[i], right[i], op[i], height[i]);

    getFinalHeight(0, 0, n - 1, finalHeight);
}

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