func_code_string: #include <bits/stdc++.h>   using namespace std;   struct pp {     long long nu, we;   } c;   struct Info {     long long l, r, ta, nu;     pp a;   } a[1000010];   long long b[100010], n, ansn, m, l, r, opt, x, sum;   pp mi(pp a, pp b) {     if (a.nu < b.nu) return b;     return a;   }   pp ga(long long nu, long long l, long long r) {     if (a[nu].l == l && a[nu].r == r) return a[nu].a;     long long mid = (a[nu].l + a[nu].r) / 2;     pp u;     u.nu = -1e18;     if (l <= mid) u = mi(u, ga(nu * 2, l, min(mid, r)));     if (r > mid) u = mi(u, ga(nu * 2 + 1, max(mid + 1, l), r));     return u;   }   void build(long long x, long long l, long long r) {     a[x].l = l;     a[x].r = r;     a[x].ta = 0;     if (l == r) {       a[x].nu = b[l];       a[x].a.we = l;       if (l != 0 && l != n + 1) {         a[x].a.nu = b[l] - max(b[l + 1], b[l - 1]);       } else         a[x].a.nu = -1e18;     } else {       build(x * 2, l, (l + r) / 2);       build(x * 2 + 1, (l + r) / 2 + 1, r);       if (a[x * 2].a.nu >= a[x * 2 + 1].a.nu)         a[x].a = a[x * 2].a;       else         a[x].a = a[x * 2 + 1].a;     }   }   void ya(long long x) {     if (a[x].ta != 0 && a[x].l != a[x].r) {       a[x * 2].ta += a[x].ta;       a[x * 2 + 1].ta += a[x].ta;       a[x].ta = 0;     }   }   long long que(long long nu, long long x) {     if (a[nu].l == a[nu].r) {       a[nu].nu += a[nu].ta;       a[nu].ta = 0;       return a[nu].nu;     } else {       ya(nu);       if (x <= (a[nu].l + a[nu].r) / 2) return que(nu * 2, x);       return que(nu * 2 + 1, x);     }   }   void add(long long nu, long long l, long long r, long long x) {     if (a[nu].l == l && a[nu].r == r) {       a[nu].ta += x;       return;     }     long long mid = (a[nu].l + a[nu].r) / 2;     if (l <= mid) add(nu * 2, l, min(mid, r), x);     if (r > mid) add(nu * 2 + 1, max(mid + 1, l), r, x);   }   void chang(long long nu, long long x, long long y) {     if (a[nu].l == a[nu].r) {       a[nu].a.nu = y;     } else {       if (x <= (a[nu].l + a[nu].r) / 2)         chang(nu * 2, x, y);       else         chang(nu * 2 + 1, x, y);       if (a[nu * 2].a.nu >= a[nu * 2 + 1].a.nu)         a[nu].a = a[nu * 2].a;       else         a[nu].a = a[nu * 2 + 1].a;     }   }   long long cou(pp a) {     return ansn - abs(que(1, a.we - 1) - que(1, a.we)) -            abs(que(1, a.we + 1) - que(1, a.we)) +            abs(que(1, a.we - 1) - que(1, a.we) - x) +            abs(que(1, a.we + 1) - que(1, a.we) - x);   }   void chan(long long x) {     if (x < 1 || x > n) return;     long long y = que(1, x) - max(que(1, x + 1), que(1, x - 1));     chang(1, x, y);   }   int main() {     scanf( %d , &n);     for (long long i = 1; i <= n; i++) scanf( %d , &b[i]);     b[0] = b[1];     b[n + 1] = b[n];     for (long long i = 1; i < n; i++) ansn += abs(b[i + 1] - b[i]);     build(1, 0, n + 1);     scanf( %d , &m);     while (m--) {       scanf( %d %d %d %d , &opt, &l, &r, &x);       if (opt == 1) {         c = ga(1, l, r);         if (c.nu >= 0)           cout << ansn + x * 2 << endl;         else {           sum = cou(c);           if (l <= c.we - 1) sum = max(sum, cou(ga(1, l, c.we - 1)));           if (c.we + 1 <= r) sum = max(sum, cou(ga(1, c.we + 1, r)));           cout << sum << endl;         }       } else {         ansn -= abs(que(1, l - 1) - que(1, l));         ansn -= abs(que(1, r + 1) - que(1, r));         if (l == 1) l--;         if (r == n) r--;         add(1, l, r, x);         if (l == 0) l++;         if (r == n + 1) r++;         chan(l);         chan(l - 1);         chan(r);         chan(r + 1);         ansn += abs(que(1, l - 1) - que(1, l));         ansn += abs(que(1, r + 1) - que(1, r));       }     }     return 0;   }   