Alex_tz307

Wall IOI 2014

Sep 14th, 2020
128
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.50 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2.  
  3. using namespace std;
  4.  
  5. struct SegTree {
  6.     int Size;
  7.     vector < pair < int , int > > Tree;
  8.     vector < pair < bool , int > > lazy_min, lazy_max;
  9.  
  10.     void init(int N) {
  11.         Size = 1;
  12.         while(Size < N)
  13.             Size <<= 1;
  14.         Tree.assign((Size << 1) + 1, make_pair(INT_MAX, 0));
  15.         lazy_min.assign((Size << 1) + 1, make_pair(false, INT_MAX));
  16.         lazy_max.assign((Size << 1) + 1, make_pair(false, 0));
  17.     }
  18.  
  19.     void propagate(int x, int lx, int rx) {
  20.         if(lx == rx)
  21.             return;
  22.         if(lazy_min[x].first) {
  23.             Tree[x << 1].first = min(Tree[x << 1].first, lazy_min[x].second);
  24.             Tree[(x << 1) | 1].first = min(Tree[(x << 1) | 1].first, lazy_min[x].second);
  25.             Tree[x << 1].second = min(Tree[x << 1].first, Tree[x << 1].second);
  26.             Tree[(x << 1) | 1].second = min(Tree[(x << 1) | 1].first, Tree[(x << 1) | 1].second);
  27.             lazy_min[x << 1].first = lazy_min[(x << 1) | 1].first = true;
  28.             lazy_min[x << 1].second = min(lazy_min[x << 1].second, lazy_min[x].second);
  29.             lazy_min[(x << 1) | 1].second = min(lazy_min[(x << 1) | 1].second, lazy_min[x].second);
  30.             if(lazy_max[x << 1].first)
  31.                 lazy_max[x << 1].second = min(lazy_min[x << 1].second, lazy_max[x << 1].second);
  32.             if(lazy_max[(x << 1) | 1].first)
  33.                 lazy_max[(x << 1) | 1].second = min(lazy_min[(x << 1) | 1].second, lazy_max[(x << 1) | 1].second);
  34.             lazy_min[x] = make_pair(false, INT_MAX);
  35.         }
  36.         if(lazy_max[x].first) {
  37.             Tree[x << 1].second = max(Tree[x << 1].second, lazy_max[x].second);
  38.             Tree[(x << 1) | 1].second = max(Tree[(x << 1) | 1].second, lazy_max[x].second);
  39.             Tree[x << 1].first = max(Tree[x << 1].first, Tree[x << 1].second);
  40.             Tree[(x << 1) | 1].first = max(Tree[(x << 1) | 1].first, Tree[(x << 1) | 1].second);
  41.             lazy_max[x << 1].first = lazy_max[(x << 1) | 1].first = true;
  42.             lazy_max[x << 1].second = max(lazy_max[x << 1].second, lazy_max[x].second);
  43.             lazy_max[(x << 1) | 1].second = max(lazy_max[(x << 1) | 1].second, lazy_max[x].second);
  44.             if(lazy_min[x << 1].first)
  45.                 lazy_min[x << 1].second = max(lazy_min[x << 1].second, lazy_max[x << 1].second);
  46.             if(lazy_min[(x << 1) | 1].first)
  47.                 lazy_min[(x << 1) | 1].second = max(lazy_min[(x << 1) | 1].second, lazy_max[(x << 1) | 1].second);
  48.             lazy_max[x] = make_pair(false, 0);
  49.         }
  50.     }
  51.  
  52.     void maximize(int x, int lx, int rx, int st, int dr, int h) {
  53.         propagate(x, lx, rx);
  54.         if(st <= lx && rx <= dr) {
  55.             Tree[x].second = max(Tree[x].second, h);
  56.             Tree[x].first = max(Tree[x].first, Tree[x].second);
  57.             lazy_max[x].first = true;
  58.             lazy_max[x].second = max(lazy_max[x].second, h);
  59.             return;
  60.         }
  61.         int mid = (lx + rx) >> 1;
  62.         if(st <= mid)
  63.             maximize(x << 1, lx, mid, st, dr, h);
  64.         if(mid < dr)
  65.             maximize((x << 1) | 1, mid + 1, rx, st, dr, h);
  66.     }
  67.  
  68.     void minimize(int x, int lx, int rx, int st, int dr, int h) {
  69.         propagate(x, lx, rx);
  70.         if(st <= lx && rx <= dr) {
  71.             Tree[x].first = min(Tree[x].first, h);
  72.             Tree[x].second = min(Tree[x].second, Tree[x].first);
  73.             lazy_min[x].first = true;
  74.             lazy_min[x].second = min(lazy_min[x].second, h);
  75.             return;
  76.         }
  77.         int mid = (lx + rx) >> 1;
  78.         if(st <= mid)
  79.             minimize(x << 1, lx, mid, st, dr, h);
  80.         if(mid < dr)
  81.             minimize((x << 1) | 1, mid + 1, rx, st, dr, h);
  82.     }
  83.  
  84.     int query(int x, int lx, int rx, int poz) {
  85.         propagate(x, lx, rx);
  86.         if(lx == rx)
  87.             return Tree[x].second;
  88.         int mid = (lx + rx) >> 1;
  89.         if(poz <= mid)
  90.             return query(x << 1, lx, mid, poz);
  91.         else
  92.             return query((x << 1) | 1, mid + 1, rx, poz);
  93.     }
  94. };
  95.  
  96. int main() {
  97.     ios_base::sync_with_stdio(false);
  98.     cin.tie(nullptr);
  99.     cout.tie(nullptr);
  100.     int N, Q;
  101.     cin >> N >> Q;
  102.     SegTree Tree;
  103.     Tree.init(N);
  104.     while(Q--) {
  105.         int type, st, dr, h;
  106.         cin >> type >> st >> dr >> h;
  107.         ++st, ++dr;
  108.         if(type == 1)
  109.             Tree.maximize(1, 1, N, st, dr, h);
  110.         else
  111.             Tree.minimize(1, 1, N, st, dr, h);
  112.     }
  113.     for(int i = 1; i <= N; ++i)
  114.         cout << Tree.query(1, 1, N, i) << '\n';
  115. }
  116.  
Advertisement
Add Comment
Please, Sign In to add comment