#include <bits/stdc++.h>
using namespace std;
template <class S, class T>
ostream& operator<<(ostream& o, const pair<S, T>& p) {
  return o << "(" << p.first << "," << p.second << ")";
}
template <class T>
ostream& operator<<(ostream& o, const vector<T>& vc) {
  o << "sz = " << vc.size() << endl << "[";
  for (const T& v : vc) o << v << ",";
  o << "]";
  return o;
}
long long inf = 1e16;
struct starryskytree_min {
  static const int N = 1 << 17;
  long long mn[N * 2], ad[N * 2];
  void init(vector<int>& vc) {
    for (int i = 0; i < (int)(N * 2); i++) mn[i] = inf, ad[i] = 0;
    for (int i = 0; i < (int)(vc.size()); i++) mn[i + N] = vc[i];
    for (int i = N - 1; i > 0; i--) mn[i] = min(mn[i * 2], mn[i * 2 + 1]);
  }
  void add(int a, int b, int v, int l = 0, int r = N, int k = 1) {
    if (b <= l || r <= a) return;
    if (a <= l && r <= b) {
      ad[k] += v;
      return;
    }
    add(a, b, v, l, (l + r) / 2, k * 2);
    add(a, b, v, (l + r) / 2, r, k * 2 + 1);
    mn[k] = min(mn[k * 2] + ad[k * 2], mn[k * 2 + 1] + ad[k * 2 + 1]);
  }
  long long getmin(int a, int b, int l = 0, int r = N, int k = 1) {
    if (b <= l || r <= a) return inf;
    if (a <= l && r <= b) return mn[k] + ad[k];
    return ad[k] + min(getmin(a, b, l, (l + r) / 2, k * 2),
                       getmin(a, b, (l + r) / 2, r, k * 2 + 1));
  }
  long long getval(int x) { return getmin(x, x + 1); }
} smin;
struct starryskytree_max {
  static const int N = 1 << 17;
  long long mx[N * 2], ad[N * 2];
  void init(vector<int>& vc) {
    for (int i = 0; i < (int)(N * 2); i++) mx[i] = -inf, ad[i] = 0;
    for (int i = 0; i < (int)(vc.size()); i++) mx[i + N] = vc[i];
    for (int i = N - 1; i > 0; i--) mx[i] = max(mx[i * 2], mx[i * 2 + 1]);
  }
  void add(int a, int b, int v, int l = 0, int r = N, int k = 1) {
    if (b <= l || r <= a) return;
    if (a <= l && r <= b) {
      ad[k] += v;
      return;
    }
    add(a, b, v, l, (l + r) / 2, k * 2);
    add(a, b, v, (l + r) / 2, r, k * 2 + 1);
    mx[k] = max(mx[k * 2] + ad[k * 2], mx[k * 2 + 1] + ad[k * 2 + 1]);
  }
  long long getmax(int a, int b, int l = 0, int r = N, int k = 1) {
    if (b <= l || r <= a) return -inf;
    if (a <= l && r <= b) return mx[k] + ad[k];
    return ad[k] + max(getmax(a, b, l, (l + r) / 2, k * 2),
                       getmax(a, b, (l + r) / 2, r, k * 2 + 1));
  }
  long long getval(int x) { return getmax(x, x + 1); }
} smax;
const int MN = 200000;
int N, a[MN];
void init() {
  int s = 0;
  vector<int> v0, v1;
  for (int i = 0; i < (int)(N); i++) {
    if (i % 2 == 0)
      s += a[i];
    else
      s -= a[i];
    if (i % 2 == 0)
      v0.push_back(s);
    else
      v1.push_back(s);
  }
  smin.init(v0);
  smax.init(v1);
}
int query() {
  int l, r;
  scanf("%d%d", &l, &r);
  r++;
  if (l % 2 == 0) {
    long long pre = 0;
    if (l > 0) pre = smax.getval(l / 2 - 1);
    long long mx_ = smax.getmax(l / 2, r / 2);
    long long mn_ = smin.getmin(l / 2, (r + 1) / 2);
    long long mx = pre - mn_ + 1;
    long long mn = pre - mx_ + 1;
    if (mx >= 0) return 0;
    if (mn <= 0) return 0;
    long long sm;
    if (r % 2 == 0)
      sm = smax.getval(r / 2 - 1) - pre;
    else
      sm = smin.getval(r / 2) - pre - 2;
    if (sm != 0) return 0;
    return 1;
  } else {
    long long pre = smin.getval(l / 2);
    long long mx = smax.getmax(l / 2, r / 2) - pre + 1;
    long long mn = smin.getmin(l / 2 + 1, (r + 1) / 2) - pre + 1;
    if (mx >= 0) return 0;
    if (mn <= 0) return 0;
    long long sm;
    if (r % 2 == 0)
      sm = smax.getval(r / 2 - 1) - pre + 2;
    else
      sm = smin.getval(r / 2) - pre;
    if (sm != 0) return 0;
    return 1;
  }
}
int main() {
  scanf("%d", &N);
  for (int i = 0; i < (int)(N); i++) scanf("%d", a + i), a[i] *= 2;
  init();
  int Q;
  scanf("%d", &Q);
  for (int tt = 0; tt < (int)(Q); tt++) {
    int t;
    scanf("%d", &t);
    if (t == 1) {
      int l, r, k;
      scanf("%d%d%d", &l, &r, &k);
      k *= 2;
      r++;
      if (l % 2 == 0) {
        int r_ = r;
        l = l / 2, r = (r + 1) / 2;
        smin.add(l, r, k);
        if (r_ % 2 == 1) {
          smin.add(r, N / 2 + 2, k);
          smax.add(r_ / 2, N / 2 + 2, k);
        }
      } else {
        int r_ = r;
        l = l / 2, r = r / 2;
        smax.add(l, r, -k);
        if (r_ % 2 == 0) {
          smax.add(r, N / 2 + 2, -k);
          smin.add(r, N / 2 + 2, -k);
        }
      }
    } else {
      printf("%d\n", query());
    }
  }
}
