Submission #1030979

#TimeUsernameProblemLanguageResultExecution timeMemory
1030979ArthuroWichWall (IOI14_wall)C++17
100 / 100
711 ms86868 KiB
#include "wall.h"
#include <bits/stdc++.h>
using namespace std;
int segmin[4*2000005], segmax[4*2000005], lazy[4*2000005];
void lazypropagate(int n, int l, int r) {
    if (lazy[n] != -1) {
        segmin[n] = lazy[n];
        segmax[n] = lazy[n];
        if (l != r) {
            lazy[2*n] = lazy[n];
            lazy[2*n+1] = lazy[n];
        }
        lazy[n] = -1;
    }
}
void update1(int n, int l, int r, int a, int b, int h) {
    lazypropagate(n, l, r);
    if (b < l || r < a || segmin[n] >= h) {
        return;
    }
    if (a <= l && r <= b && segmax[n] < h) {
        lazy[n] = h;
        lazypropagate(n, l, r);
    } else { 
        int m = (l+r)/2;
        update1(2*n, l, m, a, b, h);
        update1(2*n+1, m+1, r, a, b, h);
        segmax[n] = max(segmax[2*n], segmax[2*n+1]);
        segmin[n] = min(segmin[2*n], segmin[2*n+1]);
    }
}
void update2(int n, int l, int r, int a, int b, int h) {
    lazypropagate(n, l, r);
    if (b < l || r < a || segmax[n] <= h) {
        return;
    }
    if (a <= l && r <= b && segmin[n] > h) {
        lazy[n] = h;
        lazypropagate(n, l, r);
    } else {
        int m = (l+r)/2;
        update2(2*n, l, m, a, b, h);
        update2(2*n+1, m+1, r, a, b, h);
        segmax[n] = max(segmax[2*n], segmax[2*n+1]);
        segmin[n] = min(segmin[2*n], segmin[2*n+1]);
    }
}
int query(int n, int l, int r, int i) {
    lazypropagate(n, l, r);
    if (l == r) {
        return segmax[n];
    } else {
        int m = (l+r)/2;
        if (l <= i && i <= m) {
            return query(2*n, l, m, i);
        } else {
            return query(2*n+1, m+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++) {
        if (op[i] == 1) {
            update1(1, 0, n-1, left[i], right[i], height[i]);
        } else {
            update2(1, 0, n-1, left[i], right[i], height[i]);
        }
    }
    for (int i = 0; i < n; i++) {
        finalHeight[i] = query(1, 0, n-1, 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...