Submission #936230

#TimeUsernameProblemLanguageResultExecution timeMemory
936230peterandvoiWall (IOI14_wall)C++17
100 / 100
663 ms75776 KiB
#include <bits/stdc++.h>

#include "wall.h"

using namespace std;

#ifdef ngu
#include "debug.h"
#else
#define debug(...) 42
#endif

const int INF = (int) 1e9;

struct segment_tree {
    int n;
    vector<int> add, rmv, s;

    segment_tree() {};

    segment_tree(int n): n(n) {
        add.resize(4 << __lg(n), -INF);
        rmv.resize(4 << __lg(n), INF);
        s.resize(4 << __lg(n));
    };

    void apply(int id, int x, int y) {
        s[id] = max(s[id], x);
        s[id] = min(s[id], y);
        if (y < add[id]) {
            add[id] = rmv[id] = y;
        } else if (x > rmv[id]) {
            add[id] = rmv[id] = x;
        } else {
            add[id] = max(add[id], x);
            rmv[id] = min(rmv[id], y);
        }
    }

    void push(int id) {
        if (add[id] != -INF || rmv[id] != INF) {
            apply(id << 1, add[id], rmv[id]);
            apply(id << 1 | 1, add[id], rmv[id]);
            add[id] = -INF;
            rmv[id] = INF;
        }
    }

    void upd(int id, int l, int r, int u, int v, int x, int y) {
        if (u <= l && r <= v) {
            apply(id, x, y);
            return;
        }
        push(id);
        int mid = l + r >> 1;
        if (u <= mid) {
            upd(id << 1, l, mid, u, v, x, y);
        }
        if (mid < v) {
            upd(id << 1 | 1, mid + 1, r, u, v, x, y);
        }
    }

    void upd(int l, int r, int x, int y) {
        upd(1, 0, n - 1, l, r, x, y);
    }

    int get(int i) {
        int id = 1, l = 0, r = n - 1;
        while (l < r) {
            int mid = l + r >> 1;
            push(id);
            id <<= 1;
            if (i <= mid) {
                r = mid;
            } else {
                l = mid + 1;
                id |= 1;
            }
        }
        return s[id];
    }
};

#ifdef ngu
const int N = (int) 1e6 + 5;

#define left phan
#define right minh

int n, k;
int op[N], left[N], right[N], height[N], finalHeight[N];
#endif

void buildWall(int n, int k, int op[], int left[], int right[], int height[], int finalHeight[]){
    segment_tree st(n);
    for (int i = 0; i < k; ++i) {
        st.upd(left[i], right[i], op[i] == 1 ? height[i] : -INF, op[i] == 2 ? height[i] : INF);
    }
    for (int i = 0; i < n; ++i) {
        finalHeight[i] = st.get(i);
    }
}

#ifdef ngu
signed main() {
    ios::sync_with_stdio(false);
    cin.tie(0);
    #ifdef ngu
    freopen("test.inp", "r", stdin);
    freopen("test.out", "w", stdout);
    #endif
    cin >> n >> k;
    for (int i = 0; i < k; ++i) {
        cin >> op[i] >> left[i] >> right[i] >> height[i];
    }
    buildWall(n, k, op, left, right, height, finalHeight);
    for (int i = 0; i < n; ++i) {
        cout << finalHeight[i] << " ";
    }
}
#endif

Compilation message (stderr)

wall.cpp: In member function 'void segment_tree::upd(int, int, int, int, int, int, int)':
wall.cpp:55:21: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   55 |         int mid = l + r >> 1;
      |                   ~~^~~
wall.cpp: In member function 'int segment_tree::get(int)':
wall.cpp:71:25: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   71 |             int mid = l + r >> 1;
      |                       ~~^~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...