#include <bits/stdc++.h>
using namespace std;
inline long long getnum() {
  char c = getchar();
  long long num, sign = 1;
  for (; c < '0' || c > '9'; c = getchar())
    if (c == '-') sign = -1;
  for (num = 0; c >= '0' && c <= '9';) {
    c -= '0';
    num = num * 10 + c;
    c = getchar();
  }
  return num * sign;
}
struct node {
  long long l, r;
  int a, li, ri, ld, rd, lid, rid;
} Tree[1200054];
long long Lazy[1200054];
int A[300004];
void create(int l, int r, int ind) {
  node &P = Tree[ind];
  if (l == r) {
    P.r = A[l];
    P.l = A[l];
    P.a = 1;
    P.li = 1;
    P.ri = 1;
    P.ld = 1;
    P.rd = 1;
    P.lid = 1;
    P.rid = 1;
    return;
  }
  int x = (l + r) / 2;
  create(l, x, 2 * ind);
  create(x + 1, r, 2 * ind + 1);
  node &L = Tree[2 * ind];
  node &R = Tree[2 * ind + 1];
  P.l = L.l;
  P.r = R.r;
  P.li = L.li;
  if (L.li == x - l + 1 && L.r < R.l) P.li = x - l + 1 + R.li;
  P.ld = L.ld;
  if (L.ld == x - l + 1 && L.r > R.l) P.ld = x - l + 1 + R.ld;
  P.ri = R.ri;
  if (R.ri == r - x && L.r > R.l) P.ri = r - x + L.ri;
  P.rd = R.rd;
  if (R.rd == r - x && L.r < R.l) P.rd = r - x + L.rd;
  P.lid = L.lid;
  if (L.lid == x - l + 1 && L.r > R.l) P.lid = x - l + 1 + R.ld;
  if (L.li == x - l + 1 && L.r < R.l) P.lid = x - l + 1 + R.lid;
  P.rid = R.rid;
  if (R.rid == r - x && L.r < R.l) P.rid = r - x + L.rd;
  if (R.ri == r - x && L.r > R.l) P.rid = r - x + L.rid;
  P.a = max(L.a, R.a);
  if (L.r > R.l) P.a = max(P.a, L.rid + R.ld);
  if (L.r < R.l) P.a = max(P.a, L.rd + R.lid);
}
void update(int l, int r, int ind, int lx, int rx, long long val) {
  node &P = Tree[ind];
  if (l == lx && r == rx) {
    P.r += val;
    P.l += val;
    Lazy[ind] += val;
    return;
  }
  if (Lazy[ind]) {
    Tree[2 * ind].r += Lazy[ind];
    Tree[2 * ind].l += Lazy[ind];
    Lazy[2 * ind] += Lazy[ind];
    Tree[2 * ind + 1].r += Lazy[ind];
    Tree[2 * ind + 1].l += Lazy[ind];
    Lazy[2 * ind + 1] += Lazy[ind];
    Lazy[ind] = 0;
  }
  int x = (l + r) / 2;
  if (rx <= x)
    update(l, x, 2 * ind, lx, rx, val);
  else if (lx > x)
    update(x + 1, r, 2 * ind + 1, lx, rx, val);
  else
    update(l, x, 2 * ind, lx, x, val),
        update(x + 1, r, 2 * ind + 1, x + 1, rx, val);
  node &L = Tree[2 * ind];
  node &R = Tree[2 * ind + 1];
  P.l = L.l;
  P.r = R.r;
  P.li = L.li;
  if (L.li == x - l + 1 && L.r < R.l) P.li = x - l + 1 + R.li;
  P.ld = L.ld;
  if (L.ld == x - l + 1 && L.r > R.l) P.ld = x - l + 1 + R.ld;
  P.ri = R.ri;
  if (R.ri == r - x && L.r > R.l) P.ri = r - x + L.ri;
  P.rd = R.rd;
  if (R.rd == r - x && L.r < R.l) P.rd = r - x + L.rd;
  P.lid = L.lid;
  if (L.lid == x - l + 1 && L.r > R.l) P.lid = x - l + 1 + R.ld;
  if (L.li == x - l + 1 && L.r < R.l) P.lid = x - l + 1 + R.lid;
  P.rid = R.rid;
  if (R.rid == r - x && L.r < R.l) P.rid = r - x + L.rd;
  if (R.ri == r - x && L.r > R.l) P.rid = r - x + L.rid;
  P.a = max(L.a, R.a);
  if (L.r > R.l) P.a = max(P.a, L.rid + R.ld);
  if (L.r < R.l) P.a = max(P.a, L.rd + R.lid);
}
int main() {
  int n = getnum();
  for (int i = 1; i <= n; i++) A[i] = getnum();
  create(1, n, 1);
  int m = getnum();
  for (; m--;) {
    int l = getnum(), r = getnum(), v = getnum();
    update(1, n, 1, l, r, v);
    printf("%d\n", Tree[1].a);
  }
}
