MaxObznyi

SegTree

Jun 18th, 2022
690
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.91 KB | None | 0 0
  1. #include <iostream>
  2. #define int long long
  3. using namespace std;
  4.  
  5. const int N = 2e5 + 5;
  6.  
  7. int n, q, a[N], t[4 * N];
  8.  
  9. ///O(n)
  10. ///we want to calculate value for vertex v which represents the range [vl; vr]
  11. void build(int v, int vl, int vr) {
  12.     if (vl == vr) {
  13.         t[v] = a[vl];
  14.         return;
  15.     }
  16.     int vm = (vl + vr) / 2;
  17.     ///calculate left son
  18.     build(2 * v, vl, vm);
  19.     ///calculate right son
  20.     build(2 * v + 1, vm + 1, vr);
  21.  
  22.     ///combine them
  23.     t[v] = t[2 * v] + t[2 * v + 1];
  24. }
  25.  
  26.  
  27. ///O(log n)
  28. void update(int v, int vl, int vr, int pos, int val) {
  29.     if (vl == vr) {
  30.         ///vl == vr == pos
  31.         t[v] = val;
  32.         a[vl] = val;
  33.         return;
  34.     }
  35.     int vm = (vl + vr) / 2;
  36.     if (pos <= vm)
  37.         ///the position in the left half => calculate left son
  38.         update(2 * v, vl, vm, pos, val);
  39.     else
  40.         ///the position in the right half => calculate right son
  41.         update(2 * v + 1, vm + 1, vr, pos, val);
  42.  
  43.     ///combine them
  44.     t[v] = t[2 * v] + t[2 * v + 1];
  45. }
  46.  
  47. ///O(log n)
  48. int get(int v, int vl, int vr, int l, int r) {
  49.     if (vl == l && vr == r)
  50.         return t[v];
  51.     int vm = (vl + vr) / 2;
  52.     ///completely in the left son
  53.     if (r <= vm)
  54.         return get(2 * v, vl, vm, l, r);
  55.  
  56.     ///completely in the right son
  57.     if (l > vm)
  58.         return get(2 * v + 1, vm + 1, vr, l, r);
  59.  
  60.     ///split by vm
  61.     return get(2 * v, vl, vm, l, vm) + get(2 * v + 1, vm + 1, vr, vm + 1, r);
  62. }
  63.  
  64. signed main()
  65. {
  66.     cin >> n >> q;
  67.     for (int i = 1; i <= n; i++)
  68.         cin >> a[i];
  69.     build(1, 1, n);
  70.  
  71.     while (q--) {
  72.         int t;
  73.         cin >> t;
  74.         if (t == 1) {
  75.             int pos, val;
  76.             cin >> pos >> val;
  77.             update(1, 1, n, pos, val);
  78.         } else {
  79.             int l, r;
  80.             cin >> l >> r;
  81.             cout << get(1, 1, n, l, r) << "\n";
  82.         }
  83.     }
  84.  
  85.     return 0;
  86. }
  87.  
Advertisement
Add Comment
Please, Sign In to add comment