#include #include #include #include #include #include #include #include #include #include #include #include #include using namespace std; #define REP(i,n) for(int i=0; i=b; --i) #define ALL(c) (c).begin(), (c).end() typedef long long ll; typedef vector VI; typedef vector VL; typedef vector VVI; typedef vector VVL; typedef pair P; typedef pair PL; struct SqrtDecomposition{ const ll INF = 1e18; int n, sqrtn, k; VL dat, buk, lazy; vector lazyflag; void init(int x){ n = x; sqrtn = sqrt(n); // sqrtn = 250; k = (n + sqrtn - 1) / sqrtn; dat.assign(sqrtn * k, 0); buk.assign(k, 0); lazy.assign(k, 0); lazyflag.assign(k, false); } void eval(int b){ if (!lazyflag[b]) return; lazyflag[b] = false; FOR(i, sqrtn * b, sqrtn * (b+1) - 1){ dat[i] += lazy[b]; } lazy[b] = 0; } // [l, r) void add(int l, int r, ll x){ REP(b,k){ int p = sqrtn * b; int q = sqrtn * (b+1); if (q <= l || r <= p) continue; if (l <= p && q <= r){ buk[b] += x; lazyflag[b] = true; lazy[b] += x; }else{ eval(b); FOR(i,max(l,p),min(r,q)-1){ dat[i] += x; } buk[b] = -INF; FOR(i,p,q-1){ buk[b] = max(buk[b], dat[i]); } } } } // [l, r) ll query(int l, int r){ ll ret = -INF; REP(b,k){ int p = sqrtn * b; int q = sqrtn * (b+1); if (q <= l || r <= p) continue; if (l <= p && q <= r){ ret = max(ret, buk[b]); }else{ eval(b); FOR(i,max(l,p),min(r,q)-1){ ret = max(ret, dat[i]); } } } return ret; } }; int main() { int n; cin >> n; n--; VL a(n); REP(i,n){ scanf("%lld", &a[i]); a[i] -= 3 * i; } ll s = 3 * n; SqrtDecomposition sd; sd.init(n); REP(i,n) sd.add(i, i+1, a[i]); int q; cin >> q; while (q--){ ll l, r, d; scanf("%lld %lld %lld", &l, &r, &d); l--;r--; sd.add(l, r+1, d); printf("%lld\n", s + sd.query(0, n)); } return 0; }