Advertisement
Soupborsh

segtree_sum

Jun 4th, 2025 (edited)
16
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.31 KB | Source Code | 0 0
  1. #include <cmath>
  2. #include <cstdio>
  3. #include <vector>
  4.  
  5. #define ULL unsigned long long
  6. #define LL long long
  7. #define uint unsigned int
  8. #define uchar unsigned char
  9. #define IS_EVEN(x) (((x) & 1U) == 0)
  10.  
  11. uint n, n0, q;
  12. std::vector<int> a;
  13. std::vector<LL> t;
  14.  
  15. void build() {
  16.   for (int i = 1; i <= n; i++) {
  17.     t[i + n - 1] = a[i];
  18.   }
  19.   for (int i = n - 1; i > 0; i--) {
  20.     t[i] = t[i * 2] + t[i * 2 + 1];
  21.   }
  22.   return;
  23. }
  24.  
  25. LL get_sum(int l, int r) {
  26.   l += n - 1;
  27.   r += n - 1;
  28.   LL sum = 0;
  29.   while (l <= r) {
  30.     if (!IS_EVEN(l)) {
  31.       sum += t[l];
  32.       l += 1;
  33.     }
  34.     if (IS_EVEN(r)) {
  35.       sum += t[r];
  36.       r -= 1;
  37.     }
  38.     l /= 2;
  39.     r /= 2;
  40.   }
  41.   // sum += t[l];
  42.   return sum;
  43. }
  44.  
  45. void change(int i, int v) {
  46.   i += n - 1;
  47.   int d = v - t[i];
  48.   while (i != 0) {
  49.     t[i] += d;
  50.     i /= 2;
  51.   }
  52.   return;
  53. }
  54.  
  55. int main(void) {
  56.   scanf("%d %d", &n0, &q);
  57.   n = 1 << (uint)ceil(log2(n0));
  58.   // printf("  %u\n", n);
  59.  
  60.   a.resize(n + 1, 0);
  61.   t.resize(2 * n, 0);
  62.  
  63.   for (int i = 1; i <= n0; i++) {
  64.     scanf("%d", &a[i]);
  65.   }
  66.   build();
  67.  
  68.   uchar op;
  69.   int o1, o2;
  70.  
  71.   for (int i = 0; i < q; i++) {
  72.     scanf("%hhu %d %d", &op, &o1, &o2);
  73.     if (op == 1) {
  74.       change(o1, o2);
  75.     } else {
  76.       printf("%llu\n", get_sum(o1, o2));
  77.     }
  78.   }
  79.  
  80.   return 0;
  81. }
  82.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement