#include <bits/stdc++.h>
using namespace std;
void cmax(int &a, int b) {
  if (a < b) a = b;
}
void cmin(int &a, int b) {
  if (a > b) a = b;
}
const int N = 3e5 + 5;
int n, m;
long long a[N];
struct Result {
  long long L, R;
  int len, maxn, lmaxn, rmaxn;
  int dlmaxn, ulmaxn, drmaxn, urmaxn;
};
Result operator+(const Result a, const Result b) {
  Result ans;
  ans.L = a.L, ans.R = b.R;
  ans.len = a.len + b.len;
  ans.maxn = max(a.maxn, b.maxn);
  if (a.R != b.L) cmax(ans.maxn, a.urmaxn + b.dlmaxn);
  if (a.R > b.L) cmax(ans.maxn, a.rmaxn + b.dlmaxn);
  if (a.R < b.L) cmax(ans.maxn, a.urmaxn + b.lmaxn);
  ans.dlmaxn = a.dlmaxn;
  if (a.R > b.L && a.dlmaxn == a.len) ans.dlmaxn += b.dlmaxn;
  ans.ulmaxn = a.ulmaxn;
  if (a.R < b.L && a.ulmaxn == a.len) ans.ulmaxn += b.ulmaxn;
  ans.drmaxn = b.drmaxn;
  if (a.R > b.L && b.drmaxn == b.len) ans.drmaxn += a.drmaxn;
  ans.urmaxn = b.urmaxn;
  if (a.R < b.L && b.urmaxn == b.len) ans.urmaxn += a.urmaxn;
  ans.lmaxn = a.lmaxn;
  if (a.lmaxn == a.len) {
    if (a.R > b.L) ans.lmaxn += b.dlmaxn;
    if (a.R < b.L && a.lmaxn == a.ulmaxn) ans.lmaxn += b.lmaxn;
  }
  ans.rmaxn = b.rmaxn;
  if (b.rmaxn == b.len) {
    if (a.R < b.L) ans.rmaxn += a.urmaxn;
    if (a.R > b.L && b.rmaxn == b.drmaxn) ans.rmaxn += a.rmaxn;
  }
  return ans;
}
struct Seg_Tree {
  struct Node {
    Result data;
    long long tag;
  } tr[N << 2];
  void up(int u) { tr[u].data = tr[u << 1].data + tr[u << 1 | 1].data; }
  void updata(int u, long long z) {
    tr[u].data.L += z, tr[u].data.R += z, tr[u].tag += z;
  }
  void down(int u) {
    updata(u << 1, tr[u].tag);
    updata(u << 1 | 1, tr[u].tag);
    tr[u].tag = 0;
  }
  void build(int u, int l, int r, long long a[]) {
    if (l == r) {
      updata(u, a[l]);
      tr[u].data.len = tr[u].data.maxn = 1;
      tr[u].data.lmaxn = tr[u].data.rmaxn = 1;
      tr[u].data.ulmaxn = tr[u].data.dlmaxn = 1;
      tr[u].data.urmaxn = tr[u].data.drmaxn = 1;
      return;
    }
    int mid = (l + r) >> 1;
    build(u << 1, l, mid, a);
    build(u << 1 | 1, mid + 1, r, a);
    up(u);
  }
  void add(int u, int l, int r, int x, int y, long long z) {
    if (x <= l && r <= y) {
      updata(u, z);
      return;
    }
    int mid = (l + r) >> 1;
    down(u);
    if (x <= mid) add(u << 1, l, mid, x, y, z);
    if (y > mid) add(u << 1 | 1, mid + 1, r, x, y, z);
    up(u);
  }
} t;
int main() {
  cin >> n;
  for (int i = 1; i <= n; ++i) scanf("%lld", &a[i]);
  t.build(1, 1, n, a);
  cin >> m;
  while (m--) {
    int x, y;
    long long z;
    scanf("%d%d%lld", &x, &y, &z);
    t.add(1, 1, n, x, y, z);
    printf("%d\n", t.tr[1].data.maxn);
  }
  return 0;
}
