Advertisement
erek1e

IOI '14 P2 - Wall (Standard I/O)

Jun 21st, 2022
923
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.79 KB | None | 0 0
  1. #include <iostream>
  2. #include <vector>
  3.  
  4. using namespace std;
  5.  
  6. const int INF = 1e6;
  7.  
  8. struct Segtree {
  9.     int n;
  10.     vector<int> left, right;
  11.     Segtree() {}
  12.     Segtree(int nn) {
  13.         n = nn;
  14.         left = vector<int>(4*n);
  15.         right = vector<int>(4*n, INF);
  16.     }
  17.     void combine(int i, int l, int r) { // add {l, r} onto i
  18.         if (i > left.size()) return;
  19.         if (l > right[i]) left[i] = right[i] = l;
  20.         else if (r < left[i]) left[i] = right[i] = r;
  21.         else left[i] = max(left[i], l), right[i] = min(right[i], r);
  22.     }
  23.     void propagate(int i) {
  24.         combine(2*i, left[i], right[i]);
  25.         combine(2*i+1, left[i], right[i]);
  26.         left[i] = 0, right[i] = INF;
  27.     }
  28.     // [ql, qr) is query range
  29.     // [hl, hr] is query height values
  30.     // [nl, nr) is node range of elements controlled
  31.     void update(int ql, int qr, int hl, int hr, int node, int nl, int nr) {
  32.         if (ql <= nl && nr <= qr) combine(node, hl, hr);
  33.         else if (ql < nr && nl < qr) {
  34.             propagate(node);
  35.             int mid = (nl + nr) / 2;
  36.             update(ql, qr, hl, hr, 2*node, nl, mid);
  37.             update(ql, qr, hl, hr, 2*node+1, mid, nr);
  38.         }
  39.     }
  40.     void queryAll(int node, int nl, int nr) {
  41.         if (nl + 1 == nr) cout << left[node] << '\n';
  42.         else {
  43.             propagate(node);
  44.             int mid = (nl + nr) / 2;
  45.             queryAll(2*node, nl, mid);
  46.             queryAll(2*node+1, mid, nr);
  47.         }
  48.     }
  49. };
  50.  
  51. int main() {
  52.     int n, k; cin >> n >> k;
  53.     Segtree s(n);
  54.     while (k--) {
  55.         int t, ql, qr, h, hl, hr;
  56.         cin>> t >> ql >> qr >> h;
  57.         if (t == 1) hl = h, hr = INF;
  58.         else hl = 0, hr = h;
  59.         s.update(ql, qr+1, hl, hr, 1, 0, n);
  60.     }
  61.     s.queryAll(1, 0, n);
  62.     return 0;
  63. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement