Advertisement
osipyonok

non-recursive segment tree

Feb 7th, 2017
226
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.55 KB | None | 0 0
  1. #include<bits/stdc++.h>
  2.  
  3. #define INF 1000010000
  4. #define nl '\n'
  5. #define pb push_back
  6. #define ppb pop_back
  7. #define mp make_pair
  8. #define fi first
  9. #define se second
  10. #define pii pair<int,int>
  11. #define pdd pair<double,double>
  12. #define all(c) (c).begin(), (c).end()
  13. #define SORT(c) sort(all(c))
  14. #define sz(c) (c).size()
  15. #define rep(i,n) for( int i = 0; i < n; ++i )
  16. #define repi(i,n) for( int i = 1 ; i <= n; ++i )
  17. #define repn(i,n) for( int i = n - 1 ; i >= 0 ; --i )
  18. #define repf(j,i,n) for( int j = i ; j < n ; ++j )
  19. #define die(s) {std::cout << s << nl;}
  20. #define dier(s) {std::cout << s; return 0;}
  21. #define vi vector<int>
  22. typedef long long ll;
  23. #define MAXN 1E5 + 10
  24. using namespace std;
  25.  
  26. int n;
  27.  
  28. vi t(2 * MAXN , 0);
  29.  
  30. void build(){
  31.     for(int i = n - 1 ; i > 0 ; --i){
  32.         t[i] = t[2 * i] + t[2 * i + 1];
  33.     }
  34. }
  35.  
  36. void modify(int p , int val){
  37.     for(t[p += n] = val ; p > 1 ; p /= 2){
  38.         t[p / 2] = t[p] + t[p ^ 1];
  39.     }
  40. }
  41.  
  42. int sum(int l , int r){//[l , r)
  43.     int res = 0;
  44.     for(l += n , r += n ; l < r ; l /= 2 , r /= 2){
  45.         if(l % 2){
  46.             res += t[l];
  47.             ++l;
  48.         }
  49.         if(r % 2){
  50.             --r;
  51.             res += t[r];
  52.         }
  53.     }
  54.     return res;
  55. }
  56.  
  57.  
  58. int main() {
  59.     ios_base::sync_with_stdio(false);
  60.     cin.tie(NULL);
  61.     cout.precision(0);
  62.     cin >> n;
  63.     rep(i , n){
  64.         cin >> t[n + i];
  65.     }
  66.     build();
  67.     int q;
  68.     cin >> q;
  69.     rep(i , q){
  70.         char type;
  71.         cin >> type;
  72.         if(type == 'M'){
  73.             int el , val;
  74.             cin >> el >> val;
  75.             --el;
  76.             modify(el , val);
  77.         }else{
  78.             int l , r;
  79.             cin >> l >> r;
  80.             --l , --r;
  81.             cout << sum(l , r) << nl;
  82.         }
  83.     }
  84.     return 0;
  85. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement