#include <bits/stdc++.h>
using namespace std;
const int maxn = 200005;
int a[maxn], n;
struct seginfo {
  struct node {
    long long mx, tag;
  } t[maxn * 4];
  int mov, a[maxn], cnt;
  void build(int l, int r, int jd) {
    if (l == r)
      t[jd].mx = a[l];
    else {
      int mid = l + r >> 1;
      build(l, mid, jd << 1), build(mid + 1, r, jd << 1 | 1);
      t[jd].mx = min(t[jd << 1].mx, t[jd << 1 | 1].mx);
    }
  }
  void mark(int jd, long long v) { t[jd].mx += v, t[jd].tag += v; }
  void down(int jd) {
    if (t[jd].tag)
      mark(jd << 1, t[jd].tag), mark(jd << 1 | 1, t[jd].tag), t[jd].tag = 0;
  }
  void change(int l, int r, int i, int j, int v, int jd) {
    if (j < l || i > r) return;
    if (i <= l && r <= j)
      mark(jd, v);
    else {
      int mid = l + r >> 1;
      down(jd);
      change(l, mid, i, j, v, jd << 1),
          change(mid + 1, r, i, j, v, jd << 1 | 1);
      t[jd].mx = min(t[jd << 1].mx, t[jd << 1 | 1].mx);
    }
  }
  long long query(int l, int r, int i, int j, int jd) {
    if (j < l || i > r) return (1ll << 60);
    if (i <= l && r <= j) return t[jd].mx;
    int mid = l + r >> 1;
    down(jd);
    return min(query(l, mid, i, j, jd << 1),
               query(mid + 1, r, i, j, jd << 1 | 1));
  }
  void pre_treat(int sig) {
    mov = sig;
    for (int i = mov; i + 1 <= n; i += 2) a[cnt++] = ::a[i + 1] - ::a[i];
    for (int i = 1; i < cnt; i++) a[i] += a[i - 1];
    if (!cnt) return;
    build(0, cnt - 1, 1);
  }
  void update(int l, int r, int k) {
    if (l < mov) l = mov;
    if (l > r) return;
    if ((l - mov) & 1) change(0, cnt - 1, (l - mov) / 2, cnt - 1, k, 1);
    if (!((r - mov) & 1)) change(0, cnt - 1, (r - mov) / 2, cnt - 1, -k, 1);
  }
  long long query(int l, int r) { return query(0, cnt - 1, l, r, 1); }
  long long single(int l) {
    if (l < 0) return 0;
    return query(0, cnt - 1, l, l, 1);
  }
} z[2];
int tag[maxn];
void add(int p, int v) {
  for (; p <= n; p += p & -p) tag[p] += v;
}
int query(int p) {
  int tmp = a[p];
  for (; p; p -= p & -p) tmp += tag[p];
  return tmp;
}
int main() {
  scanf("%d", &n);
  for (int i = 1; i <= n; i++) scanf("%d", &a[i]);
  z[0].pre_treat(1), z[1].pre_treat(2);
  int q;
  scanf("%d", &q);
  for (int i = 1; i <= q; i++) {
    int type, u, v, k;
    scanf("%d%d%d", &type, &u, &v);
    u++, v++;
    if (type == 1) {
      scanf("%d", &k);
      z[0].update(u, v, k), z[1].update(u, v, k);
      add(u, k), add(v + 1, -k);
    } else {
      int f_0 = query(u);
      if (f_0 < 1) {
        printf("0\n");
        continue;
      }
      if (u == v) {
        printf("%d\n", int(f_0 >= 0 && f_0 <= 2));
        continue;
      }
      long long ta, tb;
      if (u & 1) {
        ta = z[0].query((u - 1) / 2, (v - 1) / 2 - (v & 1));
        tb = z[1].query((u - 2) / 2 + (u != 1), (v - 2) / 2 - (!(v & 1)));
        ta -= z[0].single((u - 1) / 2 - 1);
        tb -= z[1].single((u - 2) / 2 + (u != 1) - 1);
      } else {
        ta = z[1].query((u - 2) / 2, (v - 2) / 2 - !(v & 1));
        tb = z[0].query((u - 1) / 2 + 1, (v - 1) / 2 - (v & 1));
        ta -= z[1].single((u - 2) / 2 - 1);
        tb -= z[0].single((u - 1) / 2);
      }
      tb += f_0 - 1;
      if (ta < 0 || tb < 0)
        printf("0\n");
      else if ((u ^ v) & 1) {
        long long va;
        if (u & 1)
          va = z[0].query((v - 1) / 2 - (v & 1), (v - 1) / 2 - (v & 1)) -
               z[0].single((u - 1) / 2 - 1);
        else
          va = z[1].query((v - 2) / 2 - !(v & 1), (v - 2) / 2 - !(v & 1)) -
               z[1].single((u - 2) / 2 - 1);
        printf("%d\n", int(va == 0));
      } else {
        long long vb = 0;
        if (u & 1)
          vb = z[1].query((v - 2) / 2 - !(v & 1), (v - 2) / 2 - !(v & 1)) -
               z[1].single((u - 2) / 2 + (u != 1) - 1);
        else
          vb = z[0].query((v - 1) / 2 - (v & 1), (v - 1) / 2 - (v & 1)) -
               z[0].single((u - 1) / 2);
        vb += f_0 - 1;
        printf("%d\n", int(vb == 0));
      }
    }
  }
  return 0;
}
