#include #include #include #include using namespace std; struct item{ long value, laziness; }; int segment_tree_size = 1; vector maximum_segment_tree; void change_item(int left, int right, long num_plus, int point_left, int point_right, int now){ if(left <= point_left && point_right <= right){ maximum_segment_tree[now].laziness = maximum_segment_tree[now].value + num_plus; }else if(point_left < left && right < point_right){ maximum_segment_tree[now].value = max(maximum_segment_tree[now * 2 + 1].value, maximum_segment_tree[now * 2 + 2].value); change_item(left, right, num_plus, point_left, (point_left + point_right) / 2, now * 2 + 1); change_item(left, right, num_plus, (point_left + point_right) / 2, point_right, now * 2 + 2); } } long maximum_in_range(int left, int right, int point_left, int point_right, int now){ if(right <= point_left || point_right <= left){ return 0; }else if(left <= point_left && point_right <= right){ return max(maximum_segment_tree[now].value, maximum_segment_tree[now].laziness); }else{ return max(maximum_in_range(left, right, point_left, (point_left + point_right) / 2, now * 2 + 1), maximum_in_range(left, right, (point_left + point_right) / 2, point_right, now * 2 + 2)); } } int main(){ int N; cin >> N; while(segment_tree_size < N - 1){ segment_tree_size *= 2; } maximum_segment_tree.resize(segment_tree_size * 2 + 1); for(int i = 0; i < maximum_segment_tree.size(); i++){ maximum_segment_tree[i].value = 0; maximum_segment_tree[i].laziness = 0; } for(int i = 0; i < N - 1; i++){ int num; cin >> num; change_item(i, i + 1, num + 3 * (N - i - 1), 0, segment_tree_size, 0); } cout << maximum_in_range(0, N, 0, segment_tree_size, 0) << endl; int M; cin >> M; for(int i = 0; i < M; i++){ int L, R, D; cin >> L >> R >> D; change_item(L - 1, R, D, 0, segment_tree_size, 0); cout << maximum_in_range(0, N, 0, segment_tree_size, 0) << endl; } }