func_code_string: #include <bits/stdc++.h>   using namespace std;   const int MAX_N = 100000;   const long long INFLL = 1e15;   int N, Q;   long long a[MAX_N + 1], b[MAX_N + 1];   long long S = 0;   long long zero(long long x) { return (x > 0) ? x : -x; }   struct SEG1 {     struct NODE {       int l, r;       bool b;     };     vector<NODE> seg;     int SZ;     void add() { seg.push_back({-1, -1, false}); }     void Init(int x) {       SZ = x;       add();       init(0, 1, SZ);     }     void init(int idx, int s, int e) {       if (s == e) return;       seg[idx].l = seg.size();       add();       seg[idx].r = seg.size();       add();       init(seg[idx].l, s, (s + e) / 2);       init(seg[idx].r, (s + e) / 2 + 1, e);     }     void Update(int x, bool y) { update(0, 1, SZ, x, y); }     void update(int idx, int s, int e, int x, bool y) {       if (s == e) {         seg[idx].b = y;         return;       }       if (x <= (s + e) / 2) {         update(seg[idx].l, s, (s + e) / 2, x, y);       } else {         update(seg[idx].r, (s + e) / 2 + 1, e, x, y);       }       seg[idx].b = (seg[seg[idx].l].b | seg[seg[idx].r].b);     }     bool Ret(int x, int y) { return ret(0, 1, SZ, x, y); }     bool ret(int idx, int s, int e, int x, int y) {       if (x <= s && e <= y) {         return seg[idx].b;       }       if (x > e || y < s) return false;       return (ret(seg[idx].l, s, (s + e) / 2, x, y) |               ret(seg[idx].r, (s + e) / 2 + 1, e, x, y));     }   } Seg1;   struct SEG2 {     struct NODE {       int l, r;       long long mn;     };     int SZ;     vector<NODE> seg;     void add() { seg.push_back({-1, -1, INFLL}); }     void Init(int x) {       SZ = x;       add();       init(0, 1, SZ);     }     void init(int idx, int s, int e) {       if (s == e) return;       seg[idx].l = seg.size();       add();       seg[idx].r = seg.size();       add();       init(seg[idx].l, s, (s + e) / 2);       init(seg[idx].r, (s + e) / 2 + 1, e);     }     void Update(int x, long long y) { update(0, 1, SZ, x, y); }     void update(int idx, int s, int e, int x, long long y) {       if (s == e) {         seg[idx].mn = y;         return;       }       if (x <= (s + e) / 2) {         update(seg[idx].l, s, (s + e) / 2, x, y);       } else {         update(seg[idx].r, (s + e) / 2 + 1, e, x, y);       }       seg[idx].mn = min(seg[seg[idx].l].mn, seg[seg[idx].r].mn);     }     long long Mn(int x, int y) { return mn(0, 1, SZ, x, y); }     long long mn(int idx, int s, int e, int x, int y) {       if (x <= s && e <= y) return seg[idx].mn;       if (x > e || y < s) return INFLL;       return min(mn(seg[idx].l, s, (s + e) / 2, x, y),                  mn(seg[idx].r, (s + e) / 2 + 1, e, x, y));     }   } Seg2;   void make(int x) {     if (b[x - 1] >= 0 && b[x] <= 0) {       Seg2.Update(x, INFLL);       Seg1.Update(x, true);       return;     }     Seg1.Update(x, false);     if (b[x - 1] < 0 && b[x] > 0) {       Seg2.Update(x, 2LL * b[x] - 2LL * b[x - 1]);       return;     }     if (b[x - 1] >= 0) {       Seg2.Update(x, 2LL * b[x]);     } else {       Seg2.Update(x, -2LL * b[x - 1]);     }   }   int main() {     scanf( %d , &N);     Seg1.Init(N);     Seg2.Init(N);     for (int i = 1; i <= N; i++) {       scanf( %lld , &a[i]);       if (i >= 2) {         b[i - 1] = a[i] - a[i - 1];         S += zero(b[i - 1]);       }     }     for (int i = 2; i < N; i++) {       make(i);     }     scanf( %d , &Q);     for (int i = 1; i <= Q; i++) {       int t, l, r;       long long x;       scanf( %d%d%d%lld , &t, &l, &r, &x);       if (t == 1) {         if (l == r) {           if (l == 1) {             printf( %lld n , S - zero(b[1]) + zero(b[1] - x));           } else if (l == N) {             printf( %lld n , S - zero(b[N - 1]) + zero(b[N - 1] + x));           } else {             printf( %lld n , S - zero(b[l]) - zero(b[l - 1]) + zero(b[l] - x) +                                  zero(b[l - 1] + x));           }         } else if (Seg1.Ret(l, r)) {           printf( %lld n , S + x * 2LL);         } else {           long long mx = 0LL;           long long t = Seg2.Mn(l, r);           mx = max(mx, 2LL * x - t);           if (l == 1) {             mx = max(mx, zero(b[1] - x) - zero(b[1]));           }           if (r == N) {             mx = max(mx, zero(x + b[N - 1]) - zero(b[N - 1]));           }           printf( %lld n , S + mx);         }       } else {         if (l != 1) {           S -= zero(b[l - 1]);           b[l - 1] += x;           S += zero(b[l - 1]);           make(l);           if (l != 2) make(l - 1);         }         if (r != N) {           S -= zero(b[r]);           b[r] -= x;           S += zero(b[r]);           make(r);           if (r != N - 1) make(r + 1);         }       }     }   }   