#include "bits/stdc++.h" using namespace std; #define FOR(i,j,k) for(int (i)=(j);(i)<(int)(k);++(i)) #define rep(i,j) FOR(i,0,j) #define each(x,y) for(auto &(x):(y)) #define mp make_pair #define mt make_tuple #define all(x) (x).begin(),(x).end() #define debug(x) cout<<#x<<": "<<(x)< pii; typedef vector vi; typedef vector vll; template struct LazySegtreeRMQ { int dataSize, givenL, givenR; vector lazy, dat; Cmp cmp; LazySegtreeRMQ(int n) { dataSize = 1; while (dataSize < n)dataSize *= 2; dat = lazy = vector(dataSize * 2, DEF); } void propagate(int index, int curL, int curR) { // 自分の値をlazyにもとづいて書き換えて自分のlazyをクリア。 // 子のlazyを書き換える。 if (lazy[index] != DEF) { dat[index] += lazy[index]; if (curR - curL > 1) { lazy[index * 2] += lazy[index]; lazy[index * 2 + 1] += lazy[index]; } lazy[index] = DEF; } } // [curL, curR) を評価する void update(int index, int curL, int curR, Val x) { // 範囲外であろうとpropagateは必ず呼ぶ。そうでないと、親がうまく評価されない propagate(index, curL, curR); if (givenL <= curL && curR <= givenR) { lazy[index] = x; // 直接書き換えないでindexのlazyを書き換えてpropagateを呼ぶ propagate(index, curL, curR); } else if (curR > givenL && givenR > curL) { int mid = (curL + curR) / 2, lc = index * 2, rc = lc + 1; update(lc, curL, mid, x); update(rc, mid, curR, x); dat[index] = cmp(dat[lc], dat[rc]) ? dat[lc] : dat[rc]; } } void update(int l, int r, Val x) { givenL = l; givenR = r; update(1, 0, dataSize, x); } Val query(int l, int r) { givenL = l; givenR = r; return query(1, 0, dataSize); } Val query(int index, int curL, int curR) { // 範囲外 if (curR <= givenL || givenR <= curL)return DEF; propagate(index, curL, curR); if (givenL <= curL && curR <= givenR) { return dat[index]; } else { Val lv = query(index * 2, curL, (curL + curR) / 2); Val rv = query(index * 2 + 1, (curL + curR) / 2, curR); return cmp(lv, rv) ? lv : rv; } } }; int N, T[100005], M; int main(){ ios::sync_with_stdio(false); cin.tie(0); cin >> N; rep(i, N - 1)cin >> T[i]; LazySegtreeRMQ, 0> rmq(N - 1); rep(i, N - 1) { rmq.update(i, i+1, T[i] + (N - 1-i) * 3); } cin >> M; rep(i, M) { int L, R, D; cin >> L >> R >> D; --L; rmq.update(L, R, D); cout << rmq.query(0, N - 1) << endl; } }