KiK0S

segtree

Dec 4th, 2017
384
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.10 KB | None | 0 0
  1. #include<bits/stdc++.h>
  2. #define F first
  3. #define S second
  4. #define int long long
  5. using namespace std;
  6.  
  7. vector<int> a;
  8. vector<pair<int,int>> t;
  9. int sz;
  10. void build(){
  11.     for(int i = 0; i < sz; i++){
  12.         t[i+sz].F = a[i];
  13.     }
  14.     for(int i = sz-1; i >= 1;i--){
  15.         t[i].F = max(t[2*i].F,t[2*i+1].F);
  16.     }
  17. }
  18.  
  19. void push(int v, int tl, int tr){
  20.     if(!t[v].S) return;
  21.     if(tl == tr){
  22.         t[v].F += t[v].S;
  23.         t[v].S = 0;
  24.         return;
  25.     }
  26.     t[v].F = t[v].S + max(t[2 * v].F + t[2 * v].S, t[2 * v + 1].F + t[2 * v + 1].S);
  27.     t[2 * v].S += t[v].S;
  28.     t[2 * v + 1].S += t[v].S;
  29.     t[v].S = 0;
  30. }
  31.  
  32. void upd(int v, int tl, int tr, int l, int r, int x){
  33.     push(v, tl, tr);
  34.     if(l > tr || tl > r){
  35.         return;
  36.     }
  37.     if(l == tl && tr == r){
  38.         t[v].S += x;
  39.         push(v, tl, tr);
  40.         return;
  41.     }
  42.     int tm = (tl + tr) / 2;
  43.     upd(2 * v, tl, tm, l, min(r, tm), x);
  44.     upd(2 * v + 1, tm + 1, tr, max(l, tm+1), r, x);
  45.     t[v].F = t[v].S + max(t[2 * v].F + t[2 * v].S, t[2 * v + 1].F + t[2 * v + 1].S);
  46.     push(v, tl, tr);
  47. }
  48.  
  49. int get(int v, int tl, int tr, int l, int r){
  50.     push(v, tl, tr);
  51.     if(l > tr || tl > r){
  52.         return -1e9;
  53.     }
  54.     if(tl == l && tr == r){
  55.         return t[v].F;
  56.     }
  57.     int tm = (tl + tr) / 2;
  58.     return max(get(2 * v, tl, tm, l, min(r,tm)), get(2 * v + 1, tm + 1, tr, max(l,tm+1), r));
  59. }
  60.  
  61. signed main()
  62. {
  63.     ios_base::sync_with_stdio(0);
  64.     cin.tie(0);
  65.     cout.tie(0);
  66.     int n;
  67.     cin >> n;
  68.     sz = 1;
  69.     while(sz <= n){
  70.         sz *= 2;
  71.     }
  72.     sz *= 2;
  73.     t.assign(2 * sz + 2, {-1e9,0});
  74.     a.assign(sz, -1e9);
  75.     for(int i = 0; i < n; i++){
  76.         cin >> a[i];
  77.     }
  78.     build();
  79.     int m;
  80.     cin >> m;
  81.     for(int i = 0; i < m; i++){
  82.         string s;
  83.         cin >> s;
  84.         if(s == "m"){
  85.             int l, r;
  86.             cin >> l >> r;
  87.             cout << get(1, 1, sz, l, r) << " ";
  88.         }
  89.         if(s == "a"){
  90.             int l, r, x;
  91.             cin >> l >> r >> x;
  92.             upd(1, 1, sz, l, r, x);
  93.         }
  94.     }
  95.     return 0;
  96. }
Advertisement
Add Comment
Please, Sign In to add comment