Advertisement
ke_timofeeva7

до с массовыми

Jun 12th, 2021
115
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.11 KB | None | 0 0
  1. #include <iostream>
  2. #include <string>
  3. #include <sstream>
  4. #include <vector>
  5. #include <cmath>
  6. #include <algorithm>
  7. #include <memory.h>
  8. #include <stdio.h>
  9. #include <stack>
  10. #include <deque>
  11. #include <queue>
  12. #include <set>
  13. #include <iterator>
  14. #include <map>
  15. #include <iomanip>
  16. #include <unordered_set>
  17. #define int long long
  18. #define pb push_back
  19. #define double long double
  20. #define endl "\n"
  21. #define un unsigned
  22. #define INF 1000000009
  23. #define pii pair<int, int>
  24. #define all(v) v.begin(), v.end()
  25. using namespace std;
  26.  
  27. const int R = 1 << 18;
  28.  
  29. vector<int> vc;
  30. vector<int> fl;
  31.  
  32. void build()
  33. {
  34.     for (int i = R - 1; i >= 1; i--)
  35.     {
  36.         vc[i] = max(vc[i * 2 + 1], vc[i * 2]);
  37.     }
  38.  
  39.     return;
  40. }
  41.  
  42. void push(int node)
  43. {
  44.     for (int i = 0; i < 2; i++)
  45.     {
  46.         vc[2 * node + i] += fl[node];
  47.         fl[2 * node + i] += fl[node];
  48.     }
  49.  
  50.     fl[node] = 0;
  51.     return;
  52. }
  53.  
  54. void modify(int ql, int qr, int node, int nl, int nr, int add)
  55. {
  56.     if (qr < nl || nr < ql)
  57.     {
  58.         return;
  59.     }
  60.  
  61.     if (ql <= nl && nr <= qr)
  62.     {
  63.         vc[node] += add;
  64.         fl[node] += add;
  65.  
  66.         return;
  67.     }
  68.  
  69.     push(node);
  70.  
  71.     int nm = (nl + nr) / 2;
  72.  
  73.     modify(ql, qr, 2 * node, nl, nm, add);
  74.     modify(ql, qr, 2 * node + 1, nm + 1, nr, add);
  75.  
  76.     vc[node] = max(vc[node * 2], vc[node * 2 + 1]);
  77.  
  78.     return;
  79. }
  80.  
  81. int MAX(int ql, int qr, int node, int nl, int nr)
  82. {
  83.     if (nl >= ql && nr <= qr)
  84.     {
  85.         return vc[node];
  86.     }
  87.  
  88.     if (ql > nr || nl > qr)
  89.     {
  90.         return -1;
  91.     }
  92.  
  93.     push(node);
  94.  
  95.     int nm = (nl + nr) / 2;
  96.  
  97.     int sl = MAX(ql, qr, 2 * node, nl, nm);
  98.  
  99.     int sr = MAX(ql, qr, 2 * node + 1, nm + 1, nr);
  100.  
  101.     return max(sl, sr);
  102. }
  103.  
  104. signed main()
  105. {
  106.     ios_base::sync_with_stdio(false);
  107.     cin.tie(0);
  108.     cout.tie(0);
  109.  
  110.     int n;
  111.     cin >> n;
  112.  
  113.     vc.resize(2 * R + 1, -1);
  114.     fl.resize(2 * R + 1, 0);
  115.  
  116.     for (int i = 0; i < n; i++)
  117.     {
  118.         cin >> vc[i + R];
  119.     }
  120.  
  121.     build();
  122.  
  123.     int t;
  124.     cin >> t;
  125.  
  126.     for (int i = 0; i < t; i++)
  127.     {
  128.         char c;
  129.         cin >> c;
  130.  
  131.         if (c == 'm')
  132.         {
  133.             int l, r;
  134.             cin >> l >> r;
  135.  
  136.             cout << MAX(l, r, 1, 1, R) << endl;
  137.         }
  138.         else
  139.         {
  140.             int l, r, add;
  141.             cin >> l >> r >> add;
  142.  
  143.             modify(l, r, 1, 1, R, add);
  144.         }
  145.     }
  146.  
  147.     return 0;
  148. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement