Advertisement
PikMike

Untitled

Apr 15th, 2016
359
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.33 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2.  
  3. #define pb push_back
  4. #define mp make_pair
  5. #define sz size
  6. #define ll long long
  7. #define ld long double
  8. #define fs first
  9. #define sc second
  10. #define forn(i, f, t) for(int i = f; i < t; i++)
  11. #define all(x) (x).begin(), (x).end()
  12. #define ins insert
  13.  
  14. const int INF = 2147483647;
  15. const int MOD = 1000000007;
  16. const ll INF64 = 9223372036854775807;
  17. const ld EPS = 1e-7;
  18.  
  19. using namespace std;
  20.  
  21. int a[100001], n;
  22. vector<ll> t, upd;
  23.  
  24.  
  25. void build(int v, int l, int r){
  26.     if (l == r - 1){
  27.         t[v] = (l < n ? a[l] : -INF64);
  28.         upd[v] = 0ll;
  29.         return;    
  30.     }
  31.     upd[v] = 0ll;
  32.     int m = (l + r) / 2;
  33.     build(v * 2, l, m);
  34.     build(v * 2 + 1, m, r);
  35.     t[v] = max(t[v * 2], t[v * 2 + 1]);
  36. }
  37.  
  38.  
  39. void push(int v){
  40.     if (v * 2 >= t.sz()){
  41.         upd[v] = 0ll;
  42.         return;
  43.     }
  44.     upd[v * 2] += upd[v];
  45.     upd[v * 2 + 1] += upd[v];
  46.     t[v * 2] += upd[v];
  47.     t[v * 2 + 1] += upd[v];
  48.     upd[v] = 0ll;
  49. }
  50.  
  51.  
  52. ll getMax(int v, int l, int r, int fr, int to){
  53.     push(v);
  54.     if (l >= r || fr >= to) return 0ll;
  55.     if (l == fr && r == to) return t[v];
  56.     int m = (l + r) / 2;
  57.     return max(getMax(v * 2, l, m, fr, min(to, m)), getMax(v * 2 + 1, m, r, max(fr, m), to));
  58. }
  59.  
  60.  
  61. void modify(int v, int l, int r, int fr, int to, int val){
  62.     push(v);
  63.     if (l >= r || fr >= to) return;
  64.     if (l == fr && r == to){
  65.         t[v] += (ll)val;
  66.         upd[v] += (ll)val;
  67.         return;
  68.     }
  69.     int m = (l + r) / 2;
  70.     modify(v * 2, l, m, fr, min(to, m), val);
  71.     modify(v * 2 + 1, m, r, max(m, fr), to, val);
  72.     t[v] = max(t[v * 2], t[v * 2 + 1]);
  73. }
  74.  
  75.  
  76. void printTree(int p){
  77.     forn(i, 0, p * 2) printf("%lld ", t[i]); printf("\n");
  78. }
  79.  
  80.  
  81. int main(){
  82.     int to, fr, val, m;
  83.     scanf("%d", &n);
  84.     forn(i, 0, n) scanf("%d", a + i);
  85.     int p = 1 << (int)(ceil(log(n) / log(2)) + 1);
  86.     t.assign(4 * p, 0);
  87.     upd.assign(4 * p, 0);
  88.     build(1, 0, p * 2);
  89.     scanf("%d", &m);
  90.     char c;
  91.     forn(i, 0, m){
  92.         scanf("\n%c %d %d ", &c, &fr, &to);
  93.         // cout << fr << " " << to << "\n";
  94.         if (c == 'a'){
  95.             scanf("%d", &val);
  96.             modify(1, 0, p * 2, fr - 1, to, val);
  97.         }
  98.         else if (c == 'm') printf("%lld\n", getMax(1, 0, p * 2, fr - 1, to));
  99.         // printTree(p);
  100.     }
  101.     return 0;
  102. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement