#include <bits/stdc++.h>
using namespace std;
const long long MAXN = 2e5 + 10;
const long long INF = 1e12 + 10;
struct node {
  long long len, last, lazy, odd_min, even_min;
  node() {
    len = 0;
    last = 0;
    lazy = 0;
    odd_min = INF;
    even_min = INF;
  }
};
node segt[4 * MAXN];
long long a[MAXN];
node merge_node(node x, node y) {
  node res;
  res.len = x.len + y.len;
  if (y.len & 1) {
    res.last = y.last - x.last;
  } else {
    res.last = y.last + x.last;
  }
  if (x.len & 1) {
    res.odd_min = min(x.odd_min, y.even_min + x.last);
    res.even_min = min(x.even_min, y.odd_min - x.last);
  } else {
    res.odd_min = min(x.odd_min, y.odd_min - x.last);
    res.even_min = min(x.even_min, y.even_min + x.last);
  }
  return res;
}
void build(long long id, long long L, long long R) {
  if (L == R) {
    segt[id].len = 1;
    segt[id].last = a[L];
    segt[id].odd_min = a[L];
    segt[id].even_min = INF;
    return;
  }
  long long mid = (L + R) / 2;
  build(2 * id + 1, L, mid);
  build(2 * id + 2, mid + 1, R);
  segt[id] = merge_node(segt[2 * id + 1], segt[2 * id + 2]);
}
void lzu(long long id, long long L, long long R) {
  if (L != R) {
    segt[2 * id + 1].odd_min += segt[id].lazy;
    segt[2 * id + 2].odd_min += segt[id].lazy;
    segt[2 * id + 1].lazy += segt[id].lazy;
    segt[2 * id + 2].lazy += segt[id].lazy;
    segt[2 * id + 1].last += (segt[2 * id + 1].len & 1) * segt[id].lazy;
    segt[2 * id + 2].last += (segt[2 * id + 2].len & 1) * segt[id].lazy;
  }
  segt[id].lazy = 0;
}
void update(long long id, long long L, long long R, long long l, long long r,
            long long d) {
  if (L > r || R < l) {
    return;
  }
  if (L >= l && R <= r) {
    segt[id].lazy += d;
    segt[id].odd_min += d;
    segt[id].last += (segt[id].len & 1) * d;
    return;
  }
  lzu(id, L, R);
  long long mid = (L + R) / 2;
  update(2 * id + 1, L, mid, l, r, d);
  update(2 * id + 2, mid + 1, R, l, r, d);
  segt[id] = merge_node(segt[2 * id + 1], segt[2 * id + 2]);
}
node get_res(long long id, long long L, long long R, long long l, long long r) {
  if (L > r || R < l) {
    node res;
    return res;
  }
  if (L >= l && R <= r) {
    return segt[id];
  }
  lzu(id, L, R);
  long long mid = (L + R) / 2;
  return merge_node(get_res(2 * id + 1, L, mid, l, r),
                    get_res(2 * id + 2, mid + 1, R, l, r));
}
int main() {
  ios_base ::sync_with_stdio(false);
  cin.tie(0);
  long long n;
  cin >> n;
  for (long long i = 0; i < n; i++) {
    cin >> a[i];
    a[i]--;
  }
  build(0, 0, n - 1);
  long long q;
  cin >> q;
  for (long long i = 0; i < q; i++) {
    long long type;
    cin >> type;
    if (type == 1) {
      long long l, r, k;
      cin >> l >> r >> k;
      update(0, 0, n - 1, l, r, k);
    }
    if (type == 2) {
      long long l, r;
      cin >> l >> r;
      node res = get_res(0, 0, n - 1, l, r);
      cout << (res.last == 0 && min(res.odd_min, res.even_min) >= 0) << endl;
    }
  }
}
