Advertisement
Romanchenko

Mishina_Fignya

Nov 24th, 2017
116
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.33 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2.  
  3. using namespace std;
  4.  
  5. struct vertex {
  6.     long long maxlen, l, r, p, lenl, lenr;
  7. };
  8.  
  9. vector<vertex> tree;
  10. vector<long long> a;
  11.  
  12. void dopush(long long t, long long l, long long r) {
  13.     tree[t].l += tree[t].p;
  14.     tree[t].r += tree[t].p;
  15.    
  16.     if (l < r - 1) {
  17.         tree[t * 2 + 1].p += tree[t].p;
  18.         tree[t * 2 + 2].p += tree[t].p;
  19.     }
  20.    
  21.     tree[t].p = 0;
  22. }
  23.  
  24. void setpush(long long t, long long l, long long r, long long a, long long b, long long x) {
  25.     if (l >= b || r <= a) {
  26.         return;
  27.     }
  28.     if (l >= a && r <= b) {
  29.         tree[t].p += x;
  30.         return;    
  31.     }
  32.     long long m = (l + r) / 2;
  33.     dopush(t, l, r);
  34.     dopush(t * 2 + 1, l, m);
  35.     dopush(t * 2 + 2, m, r);
  36.     setpush(t * 2 + 1, l, m, a, b, x);
  37.     setpush(t * 2 + 2, m, r, a, b, x);
  38.     dopush(t * 2 + 1, l, m);
  39.     dopush(t * 2 + 2, m, r);
  40.     tree[t].l = tree[t * 2 + 1].l + tree[t * 2 + 1].p;
  41.     tree[t].r = tree[t * 2 + 2].r + tree[t * 2 + 2].p;
  42.     tree[t].lenl = tree[t * 2 + 1].lenl;
  43.     tree[t].lenr = tree[t * 2 + 2].lenr;
  44.     tree[t].maxlen = max(tree[t * 2 + 1].maxlen, tree[t * 2 + 2].maxlen);
  45.    
  46.     if (tree[t * 2 + 1].r + tree[t * 2 + 1].p == tree[t * 2 + 2].l + tree[t * 2 + 2].p - 1) {
  47.         if (tree[t * 2 + 1].lenr + tree[t * 2 + 2].lenl > tree[t].maxlen) {
  48.             tree[t].maxlen = tree[t * 2 + 1].lenr + tree[t * 2 + 2].lenl;
  49.         }
  50.         if (tree[t].lenl == m - l) tree[t].lenl = m - l + tree[t * 2 + 2].lenl;
  51.         if (tree[t].lenr == r - m) tree[t].lenr = r - m + tree[t * 2 + 1].lenr;
  52.     }
  53. }
  54.  
  55. vertex getans(long long t, long long l, long long r, long long a, long long b) {
  56.     if (l >= b || r <= a) {
  57.         return {0, 0, 0, 0, 0, 0};
  58.     }
  59.     if (l >= a && r <= b) return tree[t];
  60.     dopush(t, l, r);
  61.     long long m = (l + r) / 2;
  62.     dopush(t * 2 + 1, l, m);
  63.     dopush(t * 2 + 2, m, r);
  64.     vertex x = getans(t * 2 + 1, l, m, a, b);
  65.     vertex y = getans(t * 2 + 2, m, r, a, b);
  66.     if (x.maxlen == 0) return y;
  67.     if (y.maxlen == 0) return x;
  68.     vertex ans;
  69.     ans.l = x.l + x.p;//vozmozhno oshibka
  70.     ans.r = y.r + y.p;//
  71.     ans.lenl = x.lenl;
  72.     ans.lenr = y.lenr;
  73.     ans.maxlen = max(x.maxlen, y.maxlen);
  74.    
  75.     if (x.r + x.p == y.l + y.p - 1) {
  76.         if (x.lenr + y.lenl >= ans.maxlen) {
  77.             ans.maxlen = x.lenr + y.lenl;
  78.         }
  79.         if (ans.lenl == m - l) ans.lenl = m - l + y.lenl;
  80.         if (ans.lenr == r - m) ans.lenr = r - m + x.lenr;
  81.        
  82.     }
  83.     return ans;
  84. }
  85.  
  86. void build(long long t, long long l, long long r) {
  87.     if (l == r - 1) {
  88.         tree[t].maxlen = 1;
  89.         tree[t].p = 0;
  90.         tree[t].l = a[l];
  91.         tree[t].r = a[l];
  92.         tree[t].lenl = 1;
  93.         tree[t].lenr = 1;
  94.         return;
  95.     }
  96.     long long m = (l + r) / 2;
  97.     build(t * 2 + 1, l, m);
  98.     build(t * 2 + 2, m, r);
  99.     tree[t].l = tree[t * 2 + 1].l;
  100.     tree[t].r = tree[t * 2 + 2].r;
  101.     tree[t].lenl = tree[t * 2 + 1].lenl;
  102.     tree[t].lenr = tree[t * 2 + 2].lenr;
  103.     tree[t].maxlen = max(tree[t * 2 + 1].maxlen, tree[t * 2 + 2].maxlen);
  104.    
  105.     if (tree[t * 2 + 1].r == tree[t * 2 + 2].l - 1) {
  106.         if (tree[t * 2 + 1].lenr + tree[t * 2 + 2].lenl > tree[t].maxlen) {
  107.             tree[t].maxlen = tree[t * 2 + 1].lenr + tree[t * 2 + 2].lenl;
  108.         }
  109.         if (tree[t].lenl == m - l) tree[t].lenl = m - l + tree[t * 2 + 2].lenl;
  110.         if (tree[t].lenr == r - m) tree[t].lenr = r - m + tree[t * 2 + 1].lenr;
  111.     }
  112. }
  113.  
  114. void print(int t, int l, int r) {
  115.     if (l == r - 1) {
  116.         cout << tree[t].l + tree[t].p << " ";
  117.         return;
  118.     }
  119.     print(t * 2 + 1, l, (l + r) / 2);
  120.     print(t * 2 + 2, (l + r) / 2, r);
  121. }
  122.  
  123. int main() {
  124.     //freopen("atoms.in", "r", stdin);
  125.     //freopen("atoms.out", "w", stdout);
  126.     long long n;
  127.    
  128.     cin >> n;
  129.     tree.resize(n * 5);
  130.     a.resize(n);
  131.     for (long long i = 0; i < n; ++i) {
  132.         cin >> a[i];
  133.     }
  134.     build(0, 0, n);
  135.     long long m;
  136.     cin >> m;
  137.     for (long long i = 0; i < m; ++i) {
  138.         char c;
  139.         long long l, r;
  140.         cin >> c >> l >> r;
  141.         --l;
  142.         if (c == '+') {
  143.             long long x;
  144.             cin >> x;
  145.             //setpush(0, 0, n, l, r, x);
  146.         } else {
  147.             cout << getans(0, 0, n, l, r).maxlen << endl;
  148.         }
  149.     }
  150.     print(0, 0, n);
  151.     return 0;
  152. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement