Advertisement
keverman

Segment tree

Feb 10th, 2020
118
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 0.85 KB | None | 0 0
  1. #define l(n) (2 * n)
  2. #define r(n) (2 * n + 1)
  3. #define f(x, y) max(x, y)
  4. #define def INT_MIN
  5.  
  6. int n;
  7. vector<int> st;
  8.  
  9. void build(vector<int>& T)
  10. {
  11.     for (n = 1; n < T.size(); n *= 2);
  12.     st.resize(n * 2, 0);
  13.  
  14.     for (int i = n; i < 2 * n; i++)
  15.         st[i] = T[i - n];
  16.     for (int i = n - 1; i > 0; i--)
  17.         st[i] = f(st[l(i)], st[r(i)]);
  18. }
  19.  
  20. void update(int pos, int val)
  21. {
  22.     st[pos += n] = val;
  23.     while ((pos /= 2) > 0)
  24.         st[pos] = f(st[l(pos)], st[r(pos)]);
  25. }
  26.  
  27. int query_rec(int l, int r, int n, int lhs, int rhs)
  28. {
  29.     if (lhs > r || rhs < l)   return def;
  30.     if (lhs >= l && rhs <= r) return st[n];
  31.     int m = lhs + (rhs - lhs) / 2;
  32.     int res = f(query_rec(l, r, l(n), lhs, m), query_rec(l, r, r(n), m + 1, rhs));
  33.     return res;
  34. }
  35.  
  36. inline int query(int l, int r)
  37. {
  38.     return query_rec(l, r, 1, 0, n - 1);
  39. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement