#include <bits/stdc++.h>
#pragma comment(linker, "/STACK:66777216")
using namespace std;
typedef double LD;
const int N = 250000 + 5;
int n;
int b[N];
long long a[N];
const int L = 200;
const int E = N / L + 10;
long long mi[2][E];
long long S[2][E];
long long ad[E];
void F(int in) {
  int s = in * L, f = min(n, (in + 1) * L);
  S[0][in] = 0;
  S[1][in] = 0;
  mi[0][in] = 1;
  mi[1][in] = 0;
  for (int i = s; i < f; ++i) {
    int ty = (i - s) % 2;
    if (i - s <= 1) {
      mi[ty][in] = a[i];
      if (i != s) mi[ty][in] -= a[i - 1];
      S[ty][in] += mi[ty][in];
    } else {
      S[ty][in] += a[i] - a[i - 1];
      mi[ty][in] = min(mi[ty][in], S[ty][in]);
    }
  }
}
void updateblock(int j, int k) {
  ad[j] += k;
  S[0][j] += k;
  mi[0][j] += k;
}
void update(int in, int l, int r, int k) {
  int s = in * L, f = min(n, (in + 1) * L);
  for (int i = s; i < f; ++i) a[i] += ad[in];
  ad[in] = 0;
  for (int i = l; i <= r; ++i) a[i] += k;
  F(in);
}
void get(int in, int l, int r, long long s[2], long long mi[2]) {
  s[0] = 0;
  s[1] = 0;
  mi[0] = 1;
  mi[1] = 0;
  for (int i = l; i <= r; ++i) {
    int ty = (i - l) % 2;
    if (i - l <= 1) {
      mi[ty] = a[i] + ad[in];
      if (i != l) mi[ty] -= a[i - 1] + ad[in];
      s[ty] += mi[ty];
    } else {
      s[ty] += a[i] - a[i - 1];
      mi[ty] = min(mi[ty], s[ty]);
    }
  }
}
int possible(int l, int r) {
  int inl = l / L;
  int inr = r / L;
  long long gs[2], gmi[2];
  if (inl == inr) {
    get(inl, l, r, gs, gmi);
  } else {
    long long s[2];
    long long mi[2];
    get(inl, l, inl * L + L - 1, s, mi);
    gs[0] = s[0], gs[1] = s[1];
    gmi[0] = mi[0], gmi[1] = mi[1];
    for (int j = inl + 1; j <= inr; ++j) {
      int ty = (j * L - l) % 2;
      long long val = ad[j - 1] + a[j * L - 1];
      if (j != inr) {
        s[0] = S[0][j];
        s[1] = S[1][j];
        mi[0] = ::mi[0][j];
        mi[1] = ::mi[1][j];
      } else {
        get(inr, inr * L, r, s, mi);
      }
      if (ty == 0) {
        gmi[0] = min(gmi[0], gs[0] + mi[0] - val);
        gmi[1] = min(gmi[1], gs[1] + mi[1]);
        gs[0] += s[0] - val;
        gs[1] += s[1];
      } else {
        gmi[0] = min(gmi[0], gs[0] + mi[1]);
        gmi[1] = min(gmi[1], gs[1] + mi[0] - val);
        gs[0] += s[1];
        gs[1] += s[0] - val;
      }
    }
  }
  if (l == r) {
    return a[l] + ad[inl] == 1;
  }
  if (gmi[0] >= 1 && gmi[1] >= 0 &&
      gs[(r - 1 - l) % 2] + (r - 1 - l) % 2 == a[r] + ad[inr])
    return true;
  return false;
}
void solve() {
  scanf("%d", &n);
  for (int i = 0; i < (int)(n); ++i) scanf("%d", &b[i]);
  for (int i = 0; i < (int)(n); ++i) a[i] = b[i];
  int m = (n + L - 1) / L;
  for (int in = 0; in * L < n; ++in) F(in);
  int Q;
  scanf("%d", &Q);
  for (int it = 1; it <= (int)(Q); ++it) {
    int ty, l, r;
    scanf("%d%d%d", &ty, &l, &r);
    int k;
    if (ty == 1) {
      scanf("%d", &k);
      int inl = l / L;
      int inr = r / L;
      for (int j = inl + 1; j <= inr - 1; ++j) {
        updateblock(j, k);
      }
      if (inl == inr) {
        update(inl, l, r, k);
      } else {
        update(inl, l, inl * L + L - 1, k);
        update(inr, inr * L, r, k);
      }
    } else {
      int res = possible(l, r);
      printf("%d\n", res);
    }
  }
}
void testgen() {
  FILE* f = fopen("input.txt", "w");
  fclose(f);
}
int main() {
  std::cout << std::fixed;
  std::cout.precision(8);
  std::cerr << std::fixed;
  std::cerr.precision(3);
  solve();
  return 0;
}
