Advertisement
Guest User

Untitled

a guest
Sep 25th, 2018
69
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.17 KB | None | 0 0
  1. #include <iostream>
  2. #include <vector>
  3. using namespace std;
  4. struct Node{
  5.     long long key, l, r, add;
  6. };
  7. vector <Node> tree(1e6);
  8. vector <long long> a(1e6);
  9. long long inf = 1e18;
  10. void build(long long ind, long long l, long long r){
  11.     tree[ind].l = l;
  12.     tree[ind].r = r;
  13.     if (r - l == 1){
  14.         tree[ind].add = 0;
  15.         tree[ind].key = a[l];
  16.         return;
  17.     }
  18.     long long m = (l + r) / 2;
  19.     build(2 * ind, l, m);
  20.     build(2 * ind + 1, m, r);
  21.     tree[ind].key = max(tree[2 * ind].key, tree[2 * ind + 1].key);
  22. }
  23. void push(long long ind){
  24.     tree[ind].key += tree[ind].add;
  25.     tree[2 * ind].add += tree[ind].add;
  26.     tree[2 * ind + 1].add += tree[ind].add;
  27.     tree[ind].add = 0;
  28. }
  29. void update(long long ind, long long l, long long r, long long add){
  30.     if (l <= tree[ind].l && tree[ind].r <= r){
  31.         tree[ind].add += add;
  32.         return;
  33.     }
  34.     else if(l >= tree[ind].r || r <= tree[ind].l){
  35.         return;
  36.     }
  37.     push(ind);
  38.     update(2 * ind, l, r, add);
  39.     update(2 * ind + 1, l, r, add);
  40. }
  41. long long search(long long ind, long long l, long long r){
  42.     if (tree[ind].add != 0){
  43.         push(ind);
  44.     }
  45.     if (l <= tree[ind].l && tree[ind].r <= r){
  46.         return tree[ind].key + tree[ind].add;
  47.     }
  48.     else if(tree[ind].l >= r || tree[ind].r <= l){
  49.         return -inf;
  50.     }
  51.     else{
  52.         return max(search(2 * ind, l, r), search(2 * ind + 1, l, r));
  53.     }
  54. }
  55. int main() {
  56.     long long n, m, l, r, number;
  57.     cin >> n;
  58.     char s;
  59.     for (long long i = 1; i < n + 1; i++){
  60.         cin >> a[i];
  61.     }
  62.     build(1, 1, n + 1);
  63.     cin >> m;
  64.     for (long long i = 0; i < m; i++){
  65.         cin >> s >> l >> r;
  66.         if (s == 'a') {
  67.             cin >> number;
  68.             update(1, l, r + 1, number);
  69.             for (long long i = 1; i < 4 * n; i++){
  70.                 cout <<  tree[i].key << ' ' << tree[i].l << ' ' << tree[i].r << '\n';
  71.             }
  72.         } else {
  73.            cout << search(1, l, r + 1) << ' ';
  74.            for (long long i = 1; i < 4 * n; i++){
  75.                 cout <<  tree[i].key << ' ' << tree[i].l << ' ' << tree[i].r << '\n';
  76.             }
  77.         }
  78.     }
  79.     return 0;
  80. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement