sandeep03edu

Segment Tree sum

Dec 7th, 2022
172
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.91 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. #define ll long long
  4. #define MOD 1000000007;
  5.  
  6. #define got cout<<"Yes\n"; return;
  7. #define got0 cout<<"Yes\n"; return 0;
  8.  
  9. #define bhak cout<<"No\n"; return;
  10. #define bhak0 cout<<"No\n"; return 0;
  11.  
  12. #define bas cout<<"\n";
  13.  
  14. ll constructTree(ll ts, ll te, ll si, vector<ll> &tree, vector<ll> &vec){
  15.     if(ts==te){
  16.         return tree[si] = vec[ts];
  17.     }
  18.    
  19.     ll mid = ts + (te-ts)/2;
  20.    
  21.     return tree[si] = constructTree(ts, mid, 2*si+1, tree, vec)  
  22.                     +
  23.                     constructTree(mid+1, te, 2*si+2, tree, vec);
  24.    
  25. }
  26.  
  27. ll getSum(ll ts, ll te, ll rs, ll re, ll si, vector<ll> &tree){
  28.     if(ts>=rs && te<=re){
  29.         return tree[si];
  30.     }
  31.    
  32.     if(ts==te){
  33.         return 0;
  34.     }
  35.    
  36.     ll mid = ts + (te-ts)/2;
  37.    
  38.     return getSum(ts, mid, rs, re, 2*si+1, tree)
  39.             +
  40.             getSum(mid+1, te, rs, re, 2*si+2, tree);
  41. }
  42.  
  43. void update(ll ts, ll te, ll tar, ll pre, ll val, ll si, vector<ll> &tree){
  44.     if(tar>=ts && tar<=te){
  45.         tree[si] += val;
  46.         tree[si] -= pre;
  47.     }
  48.     else{
  49.         return;
  50.     }
  51.    
  52.     if(ts==te){
  53.         return;
  54.     }
  55.    
  56.     ll mid = ts + (te-ts)/2;
  57.    
  58.     update(ts, mid, tar, pre, val, 2*si+1, tree);
  59.     update(mid+1, te, tar, pre, val, 2*si+2, tree);
  60. }
  61.  
  62. int main() {
  63.     ll n, m; cin>>n>>m;
  64.    
  65.     vector<ll> vec(n);
  66.     for(ll i=0; i<n; ++i) cin>>vec[i];
  67.    
  68.     vector<ll> tree(4*n, 0);
  69.    
  70.  
  71.     constructTree(0, n-1, 0, tree, vec);
  72.  
  73.     while(m--){
  74.         ll a, b, c;
  75.         cin>>a>>b>>c;
  76.        
  77.         if(a==1){
  78.             update(0, n-1, b, vec[b], c, 0, tree);
  79.             vec[b] = c;
  80.         }
  81.         else if(a==2){
  82.             // getSum(ll ts, ll te, ll rs, ll re, ll si, vector<ll> &tree){
  83.             ll sum = getSum(0, n-1, b, c-1, 0, tree);
  84.             cout<<sum; bas
  85.         }
  86.     }
  87.  
  88.     return 0;
  89. }
Advertisement
Add Comment
Please, Sign In to add comment