Advertisement
PikMike

Untitled

Apr 15th, 2016
348
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.72 KB | None | 0 0
  1. #include <iostream>
  2. #include <cstdio>
  3. #include <vector>
  4. #include <algorithm>
  5.  
  6. using namespace std;
  7.  
  8. int n, q;
  9. const long long INF = -40000000000;
  10. vector<pair<long long, int>> tree;
  11. vector<long long> a, add;
  12.  
  13. void build(int v, int tl, int tr)
  14. {
  15.     if (tl == tr)
  16.         tree[v] = (tl < a.size() ? make_pair(a[tl], tl) : make_pair(INF, -1));
  17.     else
  18.     {
  19.         int tm = (tl + tr) / 2;
  20.         build(v * 2, tl, tm);
  21.         build(v * 2 + 1, tm + 1, tr);
  22.         tree[v] = max(tree[v * 2], tree[v * 2 + 1]);
  23.     }
  24. }
  25.  
  26. void push(int v)
  27. {
  28.     if (2 * v < add.size()){
  29.         add[2 * v] += add[v];
  30.         tree[2 * v].first += add[v];
  31.     }
  32.     if (2 * v + 1 < add.size()){
  33.         add[2 * v + 1] += add[v];
  34.         tree[2 * v + 1].first += add[v];
  35.     }
  36.     add[v] = 0;
  37. }
  38.  
  39. void modify(int vl, int vr, int ql, int qr, int v, long long x)
  40. {
  41.     push(v);
  42.  
  43.     if (ql > qr)
  44.         return;
  45.  
  46.     if (ql == vl && qr == vr)
  47.     {
  48.         add[v] += x;
  49.         tree[v].first += x;
  50.         push(v);
  51.     }
  52.  
  53.     else
  54.     {
  55.         int m = (vl + vr) / 2;
  56.  
  57.         if (ql <= min(qr, m))
  58.             modify(vl, m, ql, min(qr, m), v * 2, x);
  59.         if (qr >= max(ql, m + 1))
  60.             modify(m + 1, vr, max(ql, m + 1), qr, v * 2 + 1, x);
  61.  
  62.         tree[v] = max(tree[v * 2], tree[v * 2 + 1]);
  63.     }
  64. }
  65.  
  66. pair<long long, int> get_max(int vl, int vr, int ql, int qr, int v)
  67. {
  68.     push(v);
  69.  
  70.     if (ql > qr)
  71.         return make_pair(INF, -1);
  72.  
  73.     if (ql == vl && qr == vr)
  74.         return tree[v];
  75.  
  76.     else
  77.     {
  78.         int m = (vl + vr) / 2;
  79.         pair<long long, int> a = make_pair(INF, -1), b = make_pair(INF, -1);
  80.  
  81.         if (ql <= min(qr, m))
  82.             a = get_max(vl, m, ql, min(qr, m), v * 2);
  83.         if (qr >= max(ql, m + 1))
  84.             b = get_max(m + 1, vr, max(ql, m + 1), qr, v * 2 + 1);
  85.  
  86.         return max(a, b);
  87.     }
  88. }
  89.  
  90.  
  91. int main()
  92. {
  93.     ios_base::sync_with_stdio(false);
  94.     cin.tie(nullptr);
  95.  
  96.     // freopen("0", "r", stdin);
  97.  
  98.     cin >> n;
  99.     a.resize(n * 2);
  100.    
  101.     for (int i = 0; i < n; ++i)
  102.         cin >> a[i];
  103.        
  104.     long long bin = 1;
  105.     while (bin < n)
  106.         bin *= 2;
  107.     n = bin;
  108.    
  109.     add.assign(n * 2, 0);
  110.     tree.resize(n * 2);
  111.     build(1, 0, n - 1);
  112.  
  113.     cin >> q;
  114.  
  115.     for (int i = 0; i < q; ++i)
  116.     {
  117.         string query;
  118.         int l, r;
  119.         long long num;
  120.         cin >> query;
  121.  
  122.         if (query[0] == 'm')
  123.         {
  124.             cin >> l >> r;
  125.             pair<long long, int> p = get_max(0, n - 1, --l, --r, 1);
  126.             cout << p.first << "\n";
  127.         }
  128.         else
  129.         {
  130.             cin >> l >> r >> num;
  131.             modify(0, n - 1, --l, --r, 1, num);
  132.         }
  133.     }
  134.    
  135.     return 0;
  136. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement