Advertisement
Tarche

SegTree - Tarche

Sep 11th, 2020
196
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.41 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2.  
  3. using namespace std;
  4.  
  5. typedef struct {
  6.     int val;
  7.     int l;
  8.     int r;
  9. } range;
  10.  
  11. int operator+(range a, range b) {
  12.     return a.val + b.val;
  13. }
  14.  
  15. const int IDENTITY = 0;
  16. vector<range> ST;
  17.  
  18. int nextPot(int x) {
  19.     int ans = 1;
  20.     while (ans < x) ans *= 2;
  21.     return ans;
  22. }
  23.  
  24. void update(int pos, int val) {
  25.     ST[pos].val = val;
  26.     while (pos > 0) {
  27.         pos /= 2;
  28.         ST[pos].val = ST[pos * 2] + ST[pos * 2 + 1];
  29.     }
  30. }
  31.  
  32. int query(int pos, int l, int r) {
  33.     if (ST[pos].r < l || ST[pos].l > r) return IDENTITY;
  34.     else if (l <= ST[pos].l && r >= ST[pos].r) return ST[pos].val;
  35.     return query(pos * 2, l, r) + query(pos * 2 + 1, l, r);
  36. }
  37.  
  38. int main() {
  39.     int n, q;
  40.     cin >> n >> q;
  41.     vector<int> arr(n);
  42.     for (int i = 0; i < n; i++) cin >> arr[i];
  43.  
  44.     n = nextPot(n);
  45.     arr.resize(n, IDENTITY);
  46.     ST.resize(n * 4);
  47.     for (int i = n; i < n * 2; i++) {
  48.         ST[i] = {arr[i - n], i, i};
  49.     }
  50.  
  51.     for (int i = n - 1; i >= 1; i--) {
  52.         ST[i] = {
  53.             ST[i * 2].val + ST[i * 2 + 1].val,
  54.             ST[i * 2].l,
  55.             ST[i * 2 + 1].r
  56.         };
  57.     }
  58.  
  59.     int tipo, a, b;
  60.     for (int i = 0; i < q; i++) {
  61.         cin >> tipo >> a >> b;
  62.         if (tipo == 1) {
  63.             update(a + n - 1, b);
  64.         }
  65.         else {
  66.             cout << query(1, a + n - 1, b + n - 1) << '\n';
  67.         }
  68.     }
  69. }
  70.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement