Guest User

Segment Tree

a guest
Aug 24th, 2018
185
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.88 KB | None | 0 0
  1. #include<bits/stdc++.h>
  2. #define endl '\n'
  3. #define INF 999999999
  4.  
  5. typedef long long int ll;
  6.  
  7. using namespace std;
  8.  
  9. //for Dynamic RSQ
  10. class SegmentTree{
  11.     vector <ll> st, A;
  12.     ll n;
  13.     ll left(ll i){return i<<1;}
  14.     ll right(ll i){return (i<<1)+1;}
  15.  
  16.     void build(ll node, ll start, ll end1){
  17.         if(start==end1){
  18.             st[node]=A[start];
  19.         }else{
  20.             build(left(node), start, (start+end1)/2);
  21.             build(right(node), (start+end1)/2+1, end1);
  22.         }
  23.         st[node]=st[left(node)]+st[right(node)];
  24.     }
  25.     ll rsq(ll node, ll l, ll r, ll i, ll j){
  26.         if(l>j || r<i)return 0;
  27.         if(l>=i && r<=j)return st[node];
  28.  
  29.         ll p1=rsq(left(node), l, (l+r)/2, i, j);
  30.         ll p2=rsq(right(node), (l+r)/2+1, r, i, j);
  31.         return p1+p2;
  32.     }
  33.     void update(ll node, ll l, ll r, ll idx, ll val){
  34.         if(l==r){
  35.             st[node]+=val;
  36.             A[idx]+=val;
  37.         }else{
  38.             if(l<=idx && idx<=(l+r)/2){
  39.                 update(left(node), l, (l+r)/2, idx, val);
  40.             }else{
  41.                 update(right(node), (l+r)/2+1, r, idx, val);
  42.             }
  43.             st[node]=st[left(node)]+st[right(node)];
  44.         }
  45.     }
  46.  
  47.     public:
  48.  
  49.     SegmentTree(const vector <ll> &_A){
  50.         A=_A;
  51.         n=A.size();
  52.         st.assign(6*n,0);//6*n instead of 4*n
  53.         build(1, 0, n-1);
  54.     }
  55.     ll rsq(ll i,ll j){return rsq(1,0, n-1, i, j);}
  56.     void update(ll idx, ll val){update(1, 0, n-1, idx, val);}
  57. };
  58.  
  59. int main(){
  60.     ios_base::sync_with_stdio(false);cin.tie(NULL);
  61.     ll n,q;
  62.     cin >> n >> q;
  63.     vector <ll> A;
  64.     for(int i=0; i<n; i++)A.push_back(0);
  65.     SegmentTree fan(A);
  66.     int a,b;
  67.     string k;
  68.     while(q--){
  69.         cin >> k >> a >> b;
  70.         if(k=="add"){
  71.             fan.update(a,b);
  72.         }else{
  73.             cout << fan.rsq(a,b) << endl;
  74.         }
  75.     }
  76.  
  77. }
Add Comment
Please, Sign In to add comment