Advertisement
Guest User

Segment Tree

a guest
Apr 5th, 2016
1,008
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.84 KB | None | 0 0
  1. /*
  2.  Created by Saidolda Bayan.
  3.  Copyright (c) 2015 Bayan. All rights reserved.
  4.  LANG: C++
  5.  */
  6. #include <bits/stdc++.h>
  7.  
  8. #define _USE_MATH_DEFINES
  9. #define y1 lalka
  10. #define right napravo
  11. #define left nalevo
  12. #define pb push_back
  13. #define mp make_pair
  14. #define f first
  15. #define s second
  16.  
  17. using namespace std;
  18. using pii = pair<int, int>;
  19. using ll = long long;
  20.  
  21. const int INF = (int)1e9+7, mod = (int)1e9+9, pw = 31, N = (int)1e5+123, M = (int)1e6+123;
  22. const double eps = 1e-11;
  23. const long long inf = 1e18;
  24.  
  25. struct node{
  26.     ll sum, add;
  27.     int l, r;
  28. }t[4 * N];
  29.  
  30. int a[N], n;
  31.  
  32. void push(int v){
  33.     if(t[v].add){
  34.         t[v].sum += 1ll * (t[v].r - t[v].l + 1) * t[v].add;
  35.         if(t[v].l < t[v].r){
  36.             t[v+v].add += t[v].add;
  37.             t[v+v+1].add += t[v].add;
  38.         }
  39.         t[v].add = 0;
  40.     }
  41. }
  42. void build(int v = 1, int tl = 1, int tr = n){
  43.     t[v].l = tl;
  44.     t[v].r = tr;
  45.     if(tl == tr){
  46.         t[v].sum = a[tl];
  47.     }
  48.     else{
  49.         int mid = (tl + tr) / 2;
  50.         build(v+v, tl, mid);
  51.         build(v+v+1, mid+1, tr);
  52.         t[v].sum = t[v+v].sum + t[v+v+1].sum;
  53.     }
  54. }
  55.  
  56. ll get(int l, int r, int v = 1, int tl = 1, int tr = n){
  57.     push(v);
  58.     if(max(l, tl) > min(r, tr)) return 0;
  59.     if(l <= tl && tr <= r) return t[v].sum;
  60.     int mid = (tl + tr) / 2;
  61.     return get(l, r, v+v, tl, mid) + get(l, r, v+v+1, mid+1, tr);
  62. }
  63.  
  64. void upd(int l, int r, ll x, int v = 1, int tl = 1, int tr = n){
  65.     push(v);
  66.     if(max(l, tl) > min(r, tr)) return;
  67.     if(l <= tl && tr <= r){
  68.         t[v].add += x;
  69.         push(v);
  70.         return;
  71.     }
  72.     int mid = (tl + tr) / 2;
  73.     upd(l, r, x, v+v, tl, mid);
  74.     upd(l, r, x, v+v+1, mid+1, tr);
  75.     t[v].sum = t[v+v].sum + t[v+v+1].sum;
  76. }
  77. int main ()
  78. {
  79.     ios_base::sync_with_stdio(0);cin.tie(NULL);
  80. #ifndef DEBUG
  81.     //freopen(".in","r",stdin);
  82.     //freopen(".out","w",stdout);
  83. #endif
  84.    
  85.    
  86.    
  87.     return 0;
  88. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement