func_code_string: #include <bits/stdc++.h>   using namespace std;   long long A[300010], B[300010];   int n, m;   struct node {     int negpos, negpos_pref, negpos_suf, neg, neg_pref, neg_suf, pos, pos_pref,         pos_suf, len;     node() {       negpos = negpos_pref = negpos_suf = neg = neg_pref = neg_suf = pos =           pos_pref = pos_suf = 0;     }   };   node ST[3000010];   void merge(node a, node b, node &x) {     x.negpos = x.negpos_pref = x.negpos_suf = -0x3f3f3f3f;     x.neg = x.neg_pref = x.neg_suf = -0x3f3f3f3f;     x.pos = x.pos_pref = x.pos_suf = -0x3f3f3f3f;     x.negpos = max(a.negpos, max(b.negpos, a.neg_suf + b.pos_pref));     x.negpos =         max(x.negpos, max(a.negpos_suf + b.pos_pref, a.neg_suf + b.negpos_pref));     x.negpos_pref = a.negpos_pref;     if (a.neg == a.len) x.negpos_pref = max(x.negpos_pref, a.neg + b.negpos_pref);     if (a.negpos == a.len)       x.negpos_pref = max(x.negpos_pref, a.negpos + b.pos_pref);     x.negpos_suf = b.negpos_suf;     if (b.pos == b.len) x.negpos_suf = max(x.negpos_suf, a.negpos_suf + b.pos);     if (b.negpos == b.len) x.negpos_suf = max(x.negpos_suf, a.neg_suf + b.negpos);     x.pos = a.pos + b.pos;     x.neg = a.neg + b.neg;     x.pos_pref = a.pos_pref;     if (a.pos_pref == a.len) x.pos_pref = a.len + b.pos_pref;     x.pos_suf = b.pos_suf;     if (b.pos_suf == b.len) x.pos_suf = a.pos_suf + b.len;     x.neg_pref = a.neg_pref;     if (a.neg_pref == a.len) x.neg_pref = a.len + b.neg_pref;     x.neg_suf = b.neg_suf;     if (b.neg_suf == b.len) x.neg_suf = a.neg_suf + b.len;   }   void init_node(node &x, long long v) {     x.negpos = x.negpos_pref = x.negpos_suf = 0;     x.pos = x.pos_pref = x.pos_suf = 0;     x.neg = x.neg_pref = x.neg_suf = 0;     if (v < 0) {       x.neg = x.neg_pref = x.neg_suf = 1;     } else if (v > 0) {       x.pos = x.pos_pref = x.pos_suf = 1;     }     if (v) {       x.negpos = x.negpos_pref = x.negpos_suf = 1;     }   }   void init(int N, int li, int ls) {     ST[N].len = (ls - li + 1);     if (li == ls) {       init_node(ST[N], B[li]);     } else {       int mid = (li + ls) / 2;       init(2 * N, li, mid);       init(2 * N + 1, mid + 1, ls);       merge(ST[2 * N], ST[2 * N + 1], ST[N]);     }   }   void upd(int N, int li, int ls, int p, long long v) {     if (p > ls || p < li) return;     if (li == p && ls == p) {       B[p] += v;       init_node(ST[N], B[p]);       return;     }     int mid = (li + ls) / 2;     upd(2 * N, li, mid, p, v);     upd(2 * N + 1, mid + 1, ls, p, v);     merge(ST[2 * N], ST[2 * N + 1], ST[N]);   }   int main() {     scanf( %d , &n);     for (int i = 0; i < n; i++) scanf( %lld , &A[i]);     scanf( %d , &m);     for (int i = 0; i < n - 1; i++) B[i] = A[i] - A[i + 1];     n--;     if (n == 0) {       while (m--) printf( 1 n );       return 0;     }     init(1, 0, n - 1);     for (int i = 0; i < m; i++) {       int l, r;       long long v;       scanf( %d %d %lld , &l, &r, &v);       l -= 2;       r--;       if (l >= 0 && l < n) upd(1, 0, n - 1, l, -v);       if (r >= 0 && r < n) upd(1, 0, n - 1, r, v);       printf( %d n , ST[1].negpos + 1);     }     return 0;   }   