nrk009

SEGMENT TREE

Jan 18th, 2019
112
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.82 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. #define fast ios_base::sync_with_stdio(0);cin.tie(NULL);cout.tie(NULL)
  4. #define ll long long
  5. #define ld long double
  6. #define pb push_back
  7. #define fe first
  8. #define se second
  9. #define st(x) sort(x.begin(),x.end())
  10. #define rst(x) sort(x.rbegin(),x.rend())
  11. const long double pi = 3.14159265358979323;
  12.  
  13. const double EPS = 1e-12;
  14. const int N = 1e6 + 5;
  15. const int mod = 998244353;
  16.  
  17. //segment tree
  18. ll tree[N ] , a[N];
  19. void build(ll node , ll start , ll end )
  20. {
  21.     if(start == end)
  22.     {
  23.         tree[node] = a[start];
  24.         return;
  25.     }  
  26.     ll mid = (start + end)/2;
  27.     build(2*node  , start , mid);
  28.     build(2*node + 1 , mid + 1 , end);
  29.     tree[node] = tree[2*node] + tree[2*node + 1];
  30.  
  31. }
  32.  
  33. void update(ll node , ll start , ll end , ll idx , ll val)
  34. {
  35.     if(start == end)
  36.     {
  37.         a[idx] += val;
  38.         tree[node] += val;
  39.         return;
  40.     }
  41.     else
  42.     {
  43.         ll mid = (start + end)/2;
  44.         if(idx >= start and idx <= mid)
  45.             update(2*node , start , mid  , idx , val);
  46.         else
  47.             update(2*node + 1 , mid + 1 , end , idx , val);
  48.         tree[node] = tree[2*node] + tree[2*node + 1];
  49.     }
  50. }
  51. int query(ll node , ll start , ll end , ll l , ll r)
  52. {
  53.     if(r < start or l > end)
  54.         return 0;
  55.     else if(start >= l and end <= r)
  56.         return tree[node];
  57.     ll mid = (start + end)/2;
  58.     ll p1 = query(2*node , start , mid , l , r);
  59.     ll p2 = query(2*node + 1 , mid + 1 , end , l , r);
  60.     return p1 + p2;
  61.  
  62. }
  63. int main()
  64. {
  65.    
  66.     fast;
  67.     ll n ;
  68.     cin >> n ;
  69.     for(int i = 1 ; i <= n ; i++)
  70.         cin >> a[i];
  71.     ll m , l , r, ch  , idx , val;
  72.     build(1 ,1 , n );
  73.     cin >> m ;
  74.     while(m--)
  75.     {
  76.         cin >> ch;
  77.         if(ch){
  78.         cin >> l >> r ;
  79.         cout << query(1 , 1 , n  , l , r) << "\n";
  80.         }
  81.         else{
  82.         cin >> idx >> val;
  83.         update(1 , 1 ,n , idx ,val);
  84.     }
  85.  
  86.     }
  87.  
  88.  
  89.  
  90.  
  91. return 0;
  92. }
Add Comment
Please, Sign In to add comment