Alex_tz307

ARBORE DE INTERVALE

Aug 16th, 2021
636
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 5.79 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. /// #define int long long
  3. #define INF 0x3f3f3f3f
  4.  
  5. using namespace std;
  6.  
  7. /* ifstream fin(".in");
  8. ofstream fout(".out"); */
  9.  
  10. /*
  11. - TIPURI DE DATE!!!
  12.  
  13. - DE SCHIMBAT:
  14.   * node -> operator
  15.   * update_node */
  16.  
  17. /// const int INF = 1e16L;
  18. const int NO_OPERATION = INF;
  19.  
  20. void min_self(int &x, int y) {
  21.   if (x > y)
  22.     x = y;
  23. }
  24.  
  25. void max_self(int &x, int y) {
  26.   if (x < y)
  27.     x = y;
  28. }
  29.  
  30. struct node {
  31.   int val, lazy_sum, lazy_set;
  32.  
  33.   friend node operator + (const node &A, const node &B) {
  34.     node ans;
  35.     ans.val = A.val + B.val;
  36.     /// ans.val = min(A.val, B.val); - MIN
  37.     /// ans.val = max(A.val, B.val); - MAX
  38.     ans.lazy_sum = 0;
  39.     ans.lazy_set = NO_OPERATION;
  40.     return ans;
  41.   }
  42. };
  43.  
  44. const node empty_node = {0, 0, NO_OPERATION};
  45.  
  46. struct SegTree {
  47.   int Size;
  48.   vector<node> tree;
  49.  
  50.   SegTree(int n) {
  51.     Size = 1;
  52.     while (Size < n)
  53.       Size <<= 1;
  54.     tree.resize(Size << 1, empty_node);
  55.   }
  56.  
  57.   void build(int x, int lx, int rx) {
  58.     if (lx == rx) {
  59.       int val;
  60.       cin >> val;
  61.       tree[x].val = val;
  62.       tree[x].lazy_sum = 0;
  63.       tree[x].lazy_set = NO_OPERATION;
  64.       return;
  65.     }
  66.     int mid = (lx + rx) >> 1, lSon = x << 1, rSon = x << 1 | 1;
  67.     build(lSon, lx, mid);
  68.     build(rSon, mid + 1, rx);
  69.     tree[x] = tree[lSon] + tree[rSon];
  70.   }
  71.  
  72.   void update_node_set(int x, int lx, int rx, int val) {
  73.     tree[x].lazy_sum = 0;
  74.     tree[x].val = (rx - lx + 1) * val;
  75.     /// tree[x].val = val; - MIN / MAX
  76.     tree[x].lazy_set = val;
  77.   }
  78.  
  79.   void update_node_add(int x, int lx, int rx, int val) {
  80.     tree[x].val += (rx - lx + 1) * val;
  81.     /// tree[x].val += val; - MIN / MAX
  82.     tree[x].lazy_sum += val;
  83.   }
  84.  
  85.   void push_set(int x, int lx, int rx) {
  86.     int val = tree[x].lazy_set;
  87.     if (val == INF)
  88.       return;
  89.     int mid = (lx + rx) >> 1, lSon = x << 1, rSon = x << 1 | 1;
  90.     update_node_set(lSon, lx, mid, val);
  91.     update_node_set(rSon, mid + 1, rx, val);
  92.     tree[x].lazy_set = NO_OPERATION;
  93.   }
  94.  
  95.   void push_add(int x, int lx, int rx) {
  96.     int val = tree[x].lazy_sum;
  97.     if (val == 0)
  98.       return;
  99.     int mid = (lx + rx) >> 1, lSon = x << 1, rSon = x << 1 | 1;
  100.     update_node_add(lSon, lx, mid, val);
  101.     update_node_add(rSon, mid + 1, rx, val);
  102.     tree[x].lazy_sum = 0;
  103.   }
  104.  
  105.   void set_pos(int x, int lx, int rx, int pos, int val) {
  106.     if (lx == rx) {
  107.       tree[x].val = val;
  108.       return;
  109.     }
  110.     push_set(x, lx, rx);
  111.     push_add(x, lx, rx);
  112.     int mid = (lx + rx) >> 1, lSon = x << 1, rSon = x << 1 | 1;
  113.     if (pos <= mid)
  114.       set_pos(lSon, lx, mid, pos, val);
  115.     else set_pos(rSon, mid + 1, rx, pos, val);
  116.     tree[x] = tree[lSon] + tree[rSon];
  117.   }
  118.  
  119.   void add_pos(int x, int lx, int rx, int pos, int val) {
  120.     if (lx == rx) {
  121.       tree[x].val += val;
  122.       return;
  123.     }
  124.     push_set(x, lx, rx);
  125.     push_add(x, lx, rx);
  126.     int mid = (lx + rx) >> 1, lSon = x << 1, rSon = x << 1 | 1;
  127.     if (pos <= mid)
  128.       add_pos(lSon, lx, mid, pos, val);
  129.     else add_pos(rSon, mid + 1, rx, pos, val);
  130.     tree[x] = tree[lSon] + tree[rSon];
  131.   }
  132.  
  133.   void set_interval(int x, int lx, int rx, int st, int dr, int val) {
  134.     if (st <= lx && rx <= dr) {
  135.       update_node_set(x, lx, rx, val);
  136.       return;
  137.     }
  138.     push_set(x, lx, rx);
  139.     push_add(x, lx, rx);
  140.     int mid = (lx + rx) >> 1, lSon = x << 1, rSon = x << 1 | 1;
  141.     if (st <= mid)
  142.       set_interval(lSon, lx, mid, st, dr, val);
  143.     if (mid < dr)
  144.       set_interval(rSon, mid + 1, rx, st, dr, val);
  145.     tree[x] = tree[lSon] + tree[rSon];
  146.   }
  147.  
  148.   void add_interval(int x, int lx, int rx, int st, int dr, int val) {
  149.     if (st <= lx && rx <= dr) {
  150.       update_node_add(x, lx, rx, val);
  151.       return;
  152.     }
  153.     push_set(x, lx, rx);
  154.     push_add(x, lx, rx);
  155.     int mid = (lx + rx) >> 1, lSon = x << 1, rSon = x << 1 | 1;
  156.     if (st <= mid)
  157.       add_interval(lSon, lx, mid, st, dr, val);
  158.     if (mid < dr)
  159.       add_interval(rSon, mid + 1, rx, st, dr, val);
  160.     tree[x] = tree[lSon] + tree[rSon];
  161.   }
  162.  
  163.   int query_sum(int x, int lx, int rx, int st, int dr) {
  164.     if (st <= lx && rx <= dr)
  165.       return tree[x].val;
  166.     push_set(x, lx, rx);
  167.     push_add(x, lx, rx);
  168.     int mid = (lx + rx) >> 1, ans = 0;
  169.     if (st <= mid)
  170.       ans += query_sum(x << 1, lx, mid, st, dr);
  171.     if (mid < dr)
  172.       ans += query_sum(x << 1 | 1, mid + 1, rx, st, dr);
  173.     return ans;
  174.   }
  175.  
  176.   int query_min(int x, int lx, int rx, int st, int dr) {
  177.     if (st <= lx && rx <= dr)
  178.       return tree[x].val;
  179.     push_set(x, lx, rx);
  180.     push_add(x, lx, rx);
  181.     int mid = (lx + rx) >> 1, ans = INF;
  182.     if (st <= mid)
  183.       min_self(ans, query_min(x << 1, lx, mid, st, dr));
  184.     if (mid < dr)
  185.       min_self(ans, query_min(x << 1 | 1, mid + 1, rx, st, dr));
  186.     return ans;
  187.   }
  188.  
  189.   int query_max(int x, int lx, int rx, int st, int dr) {
  190.     if (st <= lx && rx <= dr)
  191.       return tree[x].val;
  192.     push_set(x, lx, rx);
  193.     push_add(x, lx, rx);
  194.     int mid = (lx + rx) >> 1, ans = -INF;
  195.     if (st <= mid)
  196.       max_self(ans, query_max(x << 1, lx, mid, st, dr));
  197.     if (mid < dr)
  198.       max_self(ans, query_max(x << 1 | 1, mid + 1, rx, st, dr));
  199.     return ans;
  200.   }
  201.  
  202.   node query(int x, int lx, int rx, int st, int dr) {
  203.     if (st <= lx && rx <= dr)
  204.       return tree[x];
  205.     int mid = (lx + rx) >> 1;
  206.     node ans1 = empty_node, ans2 = empty_node;
  207.     if (st <= mid)
  208.       ans1 = query(x << 1, lx, mid, st, dr);
  209.     if (mid < dr)
  210.       ans2 = query(x << 1 | 1, mid + 1, rx, st, dr);
  211.     return ans1 + ans2;
  212.   }
  213. };
  214.  
  215. int32_t main() {
  216.   ios_base::sync_with_stdio(false);
  217.   cin.tie(nullptr);
  218.   cout.tie(nullptr);
  219.   /* fin.sync_with_stdio(false);
  220.   fout.sync_with_stdio(false);
  221.   fin.tie(nullptr);
  222.   fout.tie(nullptr);
  223.   int n;
  224.   cin >> n;
  225.   SegTree tree(n);
  226.   tree.build(1, 1, n); */
  227.   return 0;
  228. }
  229.  
Advertisement
Add Comment
Please, Sign In to add comment