NP-Nidzo

Segment tree (sum) // build, update & query

Aug 28th, 2019
246
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.41 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2.  
  3. /** sorce for code: https://www.hackerearth.com/practice/data-structures/advanced-data-structures/segment-trees/tutorial/ **/
  4.  
  5.  /********* Credits *********/
  6.  /// Coded by:             ///
  7.  ///     - NikolaP         ///
  8.  ///                       ///
  9.  /// Compiler: C++ 14      ///
  10.  /// Date: 28 - Aug - 2019 ///
  11.  /***************************/
  12.  
  13. /** typedefs & #defines **/
  14. //{
  15.  
  16. #define fi first
  17. #define se second
  18. #define pb push_back
  19. #define mp make_pair
  20.  
  21. #define forn(i,n)    for(int i = 0 ; i < (int)(n) ; ++i)
  22. #define forv(i,l,n)  for(int i = (int)(l) ; i < (int)(n) ; ++i)
  23.  
  24. #define all(x)     (x).begin(), (x).end()
  25. #define allr(x)    (x).rbegin(), (x).rend()
  26. #define mems(a,x)  memset((a),(int)(x),sizeof((a)))
  27. #define memsb(a,x) memset((a),(bool)(x),sizeof(a))
  28.  
  29. using namespace std;
  30.  
  31. typedef long long int ll;
  32. typedef double ld;
  33. typedef pair<int,int> ii;
  34. typedef vector<int> vi;
  35. typedef vector<ii> vii;
  36. typedef vector<ll> vll;
  37. typedef vector<vi> vvi;
  38. typedef vector<vll> vvll;
  39.  
  40. //}
  41.  
  42.  
  43.    
  44. int tree[4002]; // size = n_max * 4
  45. int arr[1000];  // size = n_max
  46.  
  47. void build(int node, int start, int end){
  48.     if(start == end)
  49.         tree[node] = arr[start];
  50.  
  51.     else{
  52.         int mid = (start + end) / 2;
  53.  
  54.         build(2*node, start , mid);
  55.         build(2*node + 1, mid+1, end);
  56.  
  57.         tree[node] = tree[2*node] + tree[2*node + 1];
  58.     }
  59. }
  60.  
  61. void update(int node, int start, int end, int id, int val){
  62.     if(start == end){
  63.         arr[id] += val;
  64.         tree[node] += val;
  65.     }
  66.  
  67.     else{
  68.         int mid = (start + end) / 2;
  69.  
  70.         if(start <= id and id <= mid)
  71.             update(2*node, start , mid , id , val);
  72.  
  73.         else
  74.             update(2*node + 1, mid+1 , end , id , val);
  75.  
  76.         tree[node] = tree[2*node] + tree[2*node +1];
  77.     }
  78. }
  79.  
  80. int query(int node, int start, int end, int l, int r){
  81.     if(r < start or end < l)
  82.         return 0;
  83.  
  84.     if(l <= start and end <= r)
  85.         return tree[node];
  86.  
  87.     int mid = (start + end) / 2;
  88.     int p1 = query(2*node, start , mid, l , r);
  89.     int p2 = query(2*node+1, mid+1 , end, l , r);
  90.     return (p1 + p2);
  91. }
  92.  
  93. int main()
  94. {
  95.     ios::sync_with_stdio(false);
  96.     cin.tie(0);
  97.     cout.precision(8);
  98.     // cout << fixed;
  99.  
  100.     int n;  cin >> n;
  101.    
  102.     forn(i,n){
  103.         cin >> arr[i];
  104.     }
  105.    
  106.     build(1,0,n-1);
  107.    
  108.     cout << query(1,0,n-1,1,2);
  109.     return 0;
  110. }
Advertisement
Add Comment
Please, Sign In to add comment