Advertisement
ThegeekKnight16

Range queries and copies

Apr 3rd, 2023
672
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.21 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. #define int long long
  4. vector<int> v;
  5. vector<int> seg, e, d;
  6.  
  7. int create()
  8. {
  9.     seg.push_back(0);
  10.     e.push_back(0);
  11.     d.push_back(0);
  12.     return seg.size()-1;
  13. }
  14.  
  15. void copy(int pos, int novo)
  16. {
  17.     seg[novo] = seg[pos];
  18.     e[novo] = e[pos];
  19.     d[novo] = d[pos];
  20. }
  21.  
  22. int update(int pos, int ini, int fim, int id, int val)
  23. {
  24.     if (id < ini || id > fim) return pos;
  25.     int novo = create();
  26.     copy(pos, novo);
  27.     if (ini == fim)
  28.     {
  29.         seg[novo] = val;
  30.         return novo;
  31.     }
  32.     int m = (ini + fim) >> 1;
  33.     if (id <= m)
  34.     {
  35.         e[novo] = update(e[novo], ini, m, id, val);
  36.     }
  37.     else
  38.     {
  39.         d[novo] = update(d[novo], m+1, fim, id, val);
  40.     }
  41.     seg[novo] = seg[e[novo]] + seg[d[novo]];
  42.     return novo;
  43. }
  44.  
  45. int query(int pos, int ini, int fim, int p, int q)
  46. {
  47.     if (q < ini || p > fim) return 0;
  48.     if (pos == 0) return 0;
  49.     if (p <= ini && fim <= q) return seg[pos];
  50.     int m = (ini + fim) >> 1;
  51.     return (query(e[pos], ini, m, p, q) + query(d[pos], m+1, fim, p, q));
  52. }
  53.  
  54. void build(int pos, int ini, int fim)
  55. {
  56.     if (ini == fim)
  57.     {
  58.         seg[pos] = v[ini];
  59.         return;
  60.     }
  61.     int m = (ini + fim) >> 1;
  62.     e[pos] = create();
  63.     d[pos] = create();
  64.     build(e[pos], ini,  m );
  65.     build(d[pos], m+1, fim);
  66.     seg[pos] = seg[e[pos]] + seg[d[pos]];
  67. }
  68.  
  69. int32_t main()
  70. {
  71.     ios_base::sync_with_stdio(false);
  72.     cin.tie(NULL);
  73.     int N, Q;
  74.     cin >> N >> Q;
  75.     v.resize(N+1);
  76.     for (int i = 1; i <= N; i++) cin >> v[i];
  77.     vector<int> raiz(2);
  78.     create(); create();
  79.     raiz[1] = 1;
  80.     build(1, 1, N);
  81.     while (Q--)
  82.     {
  83.         int type;
  84.         cin >> type;
  85.         if (type == 1)
  86.         {
  87.             int K, id, val;
  88.             cin >> K >> id >> val;
  89.             raiz[K] = update(raiz[K], 1, N, id, val);
  90.         }
  91.         else if (type == 2)
  92.         {
  93.             int K, p, q;
  94.             cin >> K >> p >> q;
  95.             cout << query(raiz[K], 1, N, p, q) << '\n';
  96.         }
  97.         else
  98.         {
  99.             int K;
  100.             cin >> K;
  101.             raiz.push_back(create());
  102.             copy(raiz[K], raiz.back());
  103.         }
  104.     }
  105. }
  106.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement