#include <bits/stdc++.h>
using namespace std;
int mark[201000 << 2];
int A[201000], n, m;
struct ST {
  int val[2], las, len;
  void update(ST a, ST b) {
    b.val[1] -= a.las;
    b.val[0] += a.las;
    if (b.len & 1)
      b.las -= a.las;
    else
      b.las += a.las;
    val[0] = min(a.val[0], b.val[a.len & 1]);
    val[1] = min(a.val[1], b.val[(a.len & 1) ^ 1]);
    las = b.las;
    len = a.len + b.len;
    return;
  }
} node[201000 << 2];
void build(int u, int L, int R) {
  if (L == R) {
    node[u].val[0] = 0;
    node[u].val[1] = node[u].las = A[L];
    node[u].len = 1;
    return;
  }
  build((u << 1), L, ((L + R) >> 1));
  build(((u << 1) | 1), (((L + R) >> 1) + 1), R);
  node[u].update(node[(u << 1)], node[((u << 1) | 1)]);
}
void down(int u, int L, int R) {
  if (!mark[u]) return;
  node[u].val[1] += mark[u];
  if (node[u].len & 1) node[u].las += mark[u];
  if (L < R) mark[(u << 1)] += mark[u], mark[((u << 1) | 1)] += mark[u];
  mark[u] = 0;
  return;
}
void change(int u, int L, int R, int l, int r, int k) {
  down(u, L, R);
  if (L == l && R == r) {
    mark[u] += k;
    down(u, L, R);
    return;
  }
  if (r < (((L + R) >> 1) + 1))
    down(((u << 1) | 1), (((L + R) >> 1) + 1), R),
        change((u << 1), L, ((L + R) >> 1), l, r, k);
  else if (l > ((L + R) >> 1))
    down((u << 1), L, ((L + R) >> 1)),
        change(((u << 1) | 1), (((L + R) >> 1) + 1), R, l, r, k);
  else {
    change((u << 1), L, ((L + R) >> 1), l, ((L + R) >> 1), k);
    change(((u << 1) | 1), (((L + R) >> 1) + 1), R, (((L + R) >> 1) + 1), r, k);
  }
  node[u].update(node[(u << 1)], node[((u << 1) | 1)]);
}
ST query(int u, int L, int R, int l, int r) {
  down(u, L, R);
  if (L == l && R == r) return node[u];
  if (r < (((L + R) >> 1) + 1))
    return query((u << 1), L, ((L + R) >> 1), l, r);
  else if (l > ((L + R) >> 1))
    return query(((u << 1) | 1), (((L + R) >> 1) + 1), R, l, r);
  else {
    ST a = query((u << 1), L, ((L + R) >> 1), l, ((L + R) >> 1));
    ST b =
        query(((u << 1) | 1), (((L + R) >> 1) + 1), R, (((L + R) >> 1) + 1), r);
    a.update(a, b);
    return a;
  }
}
int main() {
  scanf("%d", &n);
  for (int i = 1; i <= n; i++) scanf("%d", &A[i]);
  build(1, 1, n);
  for (scanf("%d", &m); m; m--) {
    int t, L, R, k;
    scanf("%d %d %d", &t, &L, &R);
    L++, R++;
    if (t == 1) {
      scanf("%d", &k);
      change(1, 1, n, L, R, k);
    } else {
      ST ans = query(1, 1, n, L, R);
      if (ans.val[0] >= 0 && ans.val[1] >= 1 && ans.las - (ans.len & 1) == 0)
        printf("1\n");
      else
        printf("0\n");
    }
  }
  return 0;
}
