Submission #366829

#TimeUsernameProblemLanguageResultExecution timeMemory
366829KoDWall (IOI14_wall)C++17
100 / 100
1095 ms89324 KiB
#ifndef __APPLE__ #include "wall.h" #endif #include <bits/stdc++.h> template <class T> using Vec = std::vector<T>; constexpr int INF = 1000000; struct SegBeats { struct Node { int max, smax; int min, smin; Node(): max(0), smax(-INF), min(0), smin(INF) { } }; Vec<Node> data; SegBeats(const int size): data(size * 2) { } void fetch(const int k) { int l = k * 2; int r = k * 2 + 1; if (data[l].max < data[r].max) { std::swap(l, r); } data[k].max = data[l].max; data[k].smax = std::max(data[l].smax, (data[l].max == data[r].max ? data[r].smax : data[r].max)); if (data[l].min > data[r].min) { std::swap(l, r); } data[k].min = data[l].min; data[k].smin = std::min(data[l].smin, (data[l].min == data[r].min ? data[r].smin : data[r].min)); } void chmax(const int k, const int x) { if (x <= data[k].min) { return; } if (data[k].smin <= x) { flush(k); chmax(k * 2, x); chmax(k * 2 + 1, x); fetch(k); } else { upd_min(k, x); } } void chmin(const int k, const int x) { if (data[k].max <= x) { return; } if (x <= data[k].smax) { flush(k); chmin(k * 2, x); chmin(k * 2 + 1, x); fetch(k); } else { upd_max(k, x); } } void upd_max(const int k, const int x) { if (data[k].min == data[k].max) { data[k].min = x; } else if (data[k].smin == data[k].max) { data[k].smin = x; } data[k].max = x; } void upd_min(const int k, const int x) { if (data[k].max == data[k].min) { data[k].max = x; } else if (data[k].smax == data[k].min) { data[k].smax = x; } data[k].min = x; } void flush(const int k) { if (data[k * 2].max > data[k].max) { upd_max(k * 2, data[k].max); } if (data[k * 2 + 1].max > data[k].max) { upd_max(k * 2 + 1, data[k].max); } if (data[k * 2].min < data[k].min) { upd_min(k * 2, data[k].min); } if (data[k * 2 + 1].min < data[k].min) { upd_min(k * 2 + 1, data[k].min); } } void push(const int k) { const auto lsb = __builtin_ctz(k); for (int d = 31 - __builtin_clz(k); d != lsb; --d) { flush(k >> d); } } void pull(int k) { k >>= __builtin_ctz(k); while (k > 1) { k >>= 1; fetch(k); } } void chmax(int l, int r, const int x) { l += size(); r += size(); push(l); push(r); const auto lc = l; const auto rc = r; while (l < r) { if (l & 1) { chmax(l, x); l += 1; } if (r & 1) { r -= 1; chmax(r, x); } l >>= 1; r >>= 1; } pull(lc); pull(rc); } void chmin(int l, int r, const int x) { l += size(); r += size(); push(l); push(r); const auto lc = l; const auto rc = r; while (l < r) { if (l & 1) { chmin(l, x); l += 1; } if (r & 1) { r -= 1; chmin(r, x); } l >>= 1; r >>= 1; } pull(lc); pull(rc); } int get(int i) { i += size(); push(i); push(i + 1); return data[i].max; } int size() const { return (int) data.size() / 2; } }; void buildWall(int n, int k, int op[], int left[], int right[], int height[], int finalHeight[]) { SegBeats seg(n); for (int i = 0; i < k; ++i) { right[i] += 1; if (op[i] == 1) { seg.chmax(left[i], right[i], height[i]); } else { seg.chmin(left[i], right[i], height[i]); } } for (int i = 0; i < n; ++i) { finalHeight[i] = seg.get(i); } } #ifdef __APPLE__ int op[100]; int left[100]; int right[100]; int height[100]; int finalHeight[100]; int main() { int n, k; std::cin >> n >> k; for (int i = 0; i < k; ++i) { std::cin >> op[i] >> left[i] >> right[i] >> height[i]; } buildWall(n, k, op, left, right, height, finalHeight); for (int i = 0; i < n; ++i) { std::cout << finalHeight[i] << " \n"[i + 1 == n]; } return 0; } #endif
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...