Submission #1114636

#TimeUsernameProblemLanguageResultExecution timeMemory
1114636_callmelucianWall (IOI14_wall)C++14
100 / 100
770 ms89160 KiB
#include <bits/stdc++.h>
#include "wall.h"
using namespace std;

typedef long long ll;
typedef long double ld;
typedef pair<ll,ll> pl;
typedef pair<int,int> pii;
typedef tuple<int,int,int> tpl;

#define all(a) a.begin(), a.end()
#define filter(a) a.erase(unique(all(a)), a.end())

struct IT {
    vector<int> lo, hi;
    IT (int sz) : lo(4 * sz), hi(4 * sz) {}

    void applyRange (int k, int fL, int fR) {
        lo[k] = max(lo[k], fL), hi[k] = max(hi[k], fL);
        lo[k] = min(lo[k], fR), hi[k] = min(hi[k], fR);
    }

    void pushDown (int k) {
        applyRange(2 * k, lo[k], hi[k]), applyRange(2 * k + 1, lo[k], hi[k]);
    }

    void update (int a, int b, int fL, int fR, int k, int l, int r) {
        if (b < l || r < a) return;
        if (a <= l && r <= b)
            return applyRange(k, fL, fR), void();
        pushDown(k);
        int mid = (l + r) >> 1;
        update(a, b, fL, fR, 2 * k, l, mid);
        update(a, b, fL, fR, 2 * k + 1, mid + 1, r);
        lo[k] = min(lo[2 * k], lo[2 * k + 1]), hi[k] = max(hi[2 * k], hi[2 * k + 1]);
    }

    void dfsPrint (int k, int l, int r, int finalHeight[]) {
        if (l == r) {
            assert(lo[k] == hi[k]);
            return finalHeight[l] = lo[k], void();
        }
        pushDown(k);
        int mid = (l + r) >> 1;
        dfsPrint(2 * k, l, mid, finalHeight);
        dfsPrint(2 * k + 1, mid + 1, r, finalHeight);
        lo[k] = min(lo[2 * k], lo[2 * k + 1]), hi[k] = max(hi[2 * k], hi[2 * k + 1]);
    }
};

void buildWall (int n, int k, int op[], int left[], int right[], int height[], int finalHeight[]) {
    IT tree(n);
    for (int i = 0; i < k; i++) {
        if (op[i] == 1) tree.update(left[i], right[i], height[i], INT_MAX, 1, 0, n - 1);
        if (op[i] == 2) tree.update(left[i], right[i], INT_MIN, height[i], 1, 0, n - 1);
    }
    tree.dfsPrint(1, 0, n - 1, finalHeight);
}

#ifdef LOCAL
int main()
{
    ios::sync_with_stdio(0);
    cin.tie(0);

    int op[] = {1, 2, 2, 1, 1, 2}, left[] = {1, 4, 3, 0, 2, 6}, right[] = {8, 9, 6, 5, 2, 7};
    int height[] = {4, 1, 5, 3, 5, 0}, finalHeight[10] = {0};
    buildWall(10, 6, op, left, right, height, finalHeight);

    for (int i = 0; i < 10; i++) cout << finalHeight[i] << " ";

    return 0;
}
#endif // LOCAL
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...