Advertisement
Mlxa

ALGO Segment Tree (Recursive)

Dec 20th, 2017
148
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.71 KB | None | 0 0
  1. #include <iostream>
  2. #include <cassert>
  3. using namespace std;
  4.  
  5. namespace Mlxa {
  6.     #define read cin
  7.     #define eol '\n'
  8.     #define endln cout << eol
  9.     #define print(a) cout << a << ' ';
  10.     template <class T> inline void
  11.     println (T t) { cout << t << eol; }
  12.     template <class A, class... B> inline void
  13.     println (A a, B... b) { print(a); println(b...); }
  14.     template <class I> inline void
  15.     printseq (I b, I e) {
  16.         for (I i(b); i != e; ++i)
  17.             print(*i); endln;
  18.     }
  19. } using namespace Mlxa;
  20.  
  21. typedef long long ll;
  22. const ll Size (4 * 1000 * 1000);
  23. ll arr[Size];
  24.  
  25. namespace DO {
  26.     ll binN (0);
  27.     inline ll bin (ll a, ll b) { return a + b; }
  28.  
  29.     ll val[Size], lb[Size], rb[Size];
  30.  
  31.     ll build (ll v, ll l, ll r) {
  32.         assert(l <= r);
  33.         lb[v] = l, rb[v] = r; ll m = (l + r) / 2;
  34.         if (l == r) val[v] = arr[l];
  35.         else val[v] = bin(  build(2*v + 1, l, m),
  36.                             build(2*v + 2, m + 1, r) );
  37.         return val[v];
  38.     }
  39.  
  40.     void upd_p (ll cur, ll p, ll add) {
  41.         ll l(lb[cur]), r(rb[cur]);
  42.         assert(l < cur && cur < r);
  43.         if (l == r) {
  44.             val[cur]+= add;
  45.             arr[l]  += add;
  46.         }
  47.         ll m = (l + r) / 2;
  48.         if (p <= m) upd_p(cur*2+1, p, add);
  49.         else        upd_p(cur*2+2, p, add);
  50.     }
  51.  
  52.     ll query (ll v, ll l, ll r) {
  53.         ll mb = (lb[v] + rb[v]) / 2;
  54.         if (lb[v] == l && rb[v] == r) return val[v];
  55.         if (l > r) return binN;
  56.         ll lres = query(v*2 + 1, max(l,  lb[v]), min(r, mb));
  57.         ll rres = query(v*2 + 2, max(l, mb + 1), min(r, rb[v]));
  58.         return bin( lres, rres );
  59.     }
  60. }
  61.  
  62. using namespace DO;
  63. int main () {
  64.     ll N; read >> N;
  65.     for (ll i(0); i < N; ++i) read >> arr[i];
  66.     build(0, 0, N-1); printseq(val, val + 4*N);
  67.     ll a, b;
  68.     while (read >> a >> b) {
  69.         println(query(0, a, b));
  70.     }
  71.     return 0;
  72. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement