Advertisement
vlatkovski

Segment tree (range addition, range maximum)

Apr 6th, 2019
376
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.34 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. typedef long long ll;
  4. typedef pair<int, int> pi;
  5. typedef vector<int> vi;
  6.  
  7.  
  8.  
  9. const int inf = 1e9;
  10. const int MAXN = 300005;
  11.  
  12. int n;
  13. int arr[MAXN];
  14.  
  15. int st[4*MAXN];
  16. int lazy[4*MAXN];
  17.  
  18. void build(int v, int tl, int tr) {
  19.     if (tl == tr) {
  20.         st[v] = arr[tl];
  21.     } else {
  22.         int tm = (tl + tr) / 2;
  23.         build(2*v, tl, tm);
  24.         build(2*v+1, tm+1, tr);
  25.         st[v] = max(st[2*v], st[2*v+1]);
  26.     }
  27. }
  28.  
  29. void push(int v) {
  30.     st[2*v] += lazy[v];
  31.     lazy[2*v] += lazy[v];
  32.     st[2*v+1] += lazy[v];
  33.     lazy[2*v+1] += lazy[v];
  34.     lazy[v] = 0;
  35. }
  36.  
  37. void update(int v, int tl, int tr, int l, int r, int toadd) {
  38.     if (l > r) return;
  39.     if (l == tl && tr == r) {
  40.         st[v] += toadd;
  41.         lazy[v] += toadd;
  42.     } else {
  43.         push(v);
  44.         int tm = (tl + tr) / 2;
  45.         update(2*v, tl, tm, l, min(r, tm), toadd);
  46.         update(2*v+1, tm+1, tr, max(l, tm+1), r, toadd);
  47.         st[v] = max(st[2*v], st[2*v+1]);
  48.     }
  49. }
  50.  
  51. int query(int v, int tl, int tr, int l, int r) {
  52.     if (l > r) return -inf;
  53.     if (l <= tl && tr <= r) {
  54.         return st[v];
  55.     } else {
  56.         push(v);
  57.         int tm = (tl + tr) / 2;
  58.         return max(query(2*v, tl, tm, l, min(r, tm)),
  59.                    query(2*v+1, tm+1, r, max(l, tm+1), r));
  60.     }
  61. }
  62.  
  63. void Main() {
  64.     cout << "Enter N, the size of the array, and then N numbers\n";
  65.     cin >> n;
  66.     for (int i = 0; i < n; ++i) {
  67.         cin >> arr[i];
  68.     }
  69.     build(1, 0, n-1);
  70.     cout << "First type of query:\n";
  71.     cout << "--> 1 l r\n";
  72.     cout << "--> Get the maximum element in range [l, r]\n";
  73.     cout << "Second type of query:\n";
  74.     cout << "--> 2 l r v\n";
  75.     cout << "--> Add v to elements in range [l, r]\n";
  76.     while (true) {
  77.         int t;
  78.         cin >> t;
  79.         if (t == 1) {
  80.             int l, r;
  81.             cin >> l >> r;
  82.             cout << "max[" << l << ", " << r << "] = " << query(1, 0, n-1, l, r) << "\n";
  83.         } else {
  84.             int l, r, x;
  85.             cin >> l >> r >> x;
  86.             update(1, 0, n-1, l, r, x);
  87.         }
  88.     }
  89. }
  90.  
  91. int main() {
  92. //    ios::sync_with_stdio(false);
  93. //    cin.tie(0);
  94.     #ifdef _DEBUG
  95. //    freopen("in.txt", "r", stdin);
  96. //    freopen("out.txt", "w", stdout);
  97.     #endif
  98.     #ifndef _DEBUG
  99.     #endif
  100.     Main();
  101. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement