#include <bits/stdc++.h>   using namespace std;   const int iinf = 1e9 + 7;   const long long linf = 1ll << 40;   const double dinf = 1e10;   void scf(int &x) {     bool f = 0;     x = 0;     char c = getchar();     while ((c <  0  || c >  9 ) && c !=  - ) c = getchar();     if (c ==  - ) {       f = 1;       c = getchar();     }     while (c >=  0  && c <=  9 ) {       x = x * 10 + c -  0 ;       c = getchar();     }     if (f) x = -x;     return;   }   void scf(int &x, int &y) {     scf(x);     return scf(y);   }   void scf(int &x, int &y, int &z) {     scf(x);     scf(y);     return scf(z);   }   const int N = 2e5 + 1000;   const int Q = 3e5 + 1000;   int n;   long long a[N], dlt[2][N];   inline long long MIN(long long a, long long b) { return a < b ? a : b; }   struct seg_tree {     long long num[N << 2], lazy[N << 2];     inline int L(int i) { return i << 1; }     inline int R(int i) { return (i << 1) | 1; }     inline void update(int i) {       num[i] = MIN(num[L(i)], num[R(i)]);       return;     }     inline void push_down(int i) {       if (lazy[i]) {         int l = L(i), r = R(i);         num[l] += lazy[i];         num[r] += lazy[i];         lazy[l] += lazy[i];         lazy[r] += lazy[i];         lazy[i] = 0;       }       return;     }     inline void modify(int a, int b, long long x, int l = 0, int r = N - 1,                        int k = 1) {       if (a == l && b == r) {         num[k] += x;         lazy[k] += x;         return;       }       int mid = l + r >> 1;       push_down(k);       if (a > mid)         modify(a, b, x, mid + 1, r, R(k));       else if (b <= mid)         modify(a, b, x, l, mid, L(k));       else {         modify(a, mid, x, l, mid, L(k));         modify(mid + 1, b, x, mid + 1, r, R(k));       }       return update(k);     }     inline long long query(int a, int b, int l = 0, int r = N - 1, int k = 1) {       if (a == l && b == r) return num[k];       int mid = l + r >> 1;       push_down(k);       if (a > mid) return query(a, b, mid + 1, r, R(k));       if (b <= mid) return query(a, b, l, mid, L(k));       return MIN(query(a, mid, l, mid, L(k)),                  query(mid + 1, b, mid + 1, r, R(k)));     }     inline void build(const bool &f, int l = 0, int r = N - 1, int k = 1) {       if (l == r) {         num[k] = dlt[f][l];         return;       }       int mid = l + r >> 1;       build(f, l, mid, L(k));       build(f, mid + 1, r, R(k));       return update(k);     }     inline void builda(int l = 0, int r = N - 1, int k = 1) {       if (l == r) {         num[k] = (l >= 1 && l <= n) ? a[l] : linf;         return;       }       int mid = l + r >> 1;       builda(l, mid, L(k));       builda(mid + 1, r, R(k));       return update(k);     }   } sta, st[2];   int main() {     scanf( %d , &n);     for (int i = 0; i < N; i++) dlt[0][i] = dlt[1][i] = linf;     for (int i = 1; i <= n; i++)       scanf( %I64d , a + i), dlt[i & 1][i] = a[i] - a[i - 1];     for (int i = 3; i <= n; i += 2) dlt[1][i] += dlt[1][i - 2];     for (int i = 4; i <= n; i += 2) dlt[0][i] += dlt[0][i - 2];     st[0].build(0);     st[1].build(1);     sta.builda();     int q;     scanf( %d , &q);     for (int i = 0; i < q; i++) {       int op, l, r, l1, r1;       scanf( %d%d%d , &op, &l, &r);       l++;       r++;       l1 = l + 1;       r1 = r + 1;       bool L = l & 1, R = r & 1, L1 = l1 & 1, R1 = r1 & 1;       if (op == 1) {         long long x;         scanf( %I64d , &x);         sta.modify(l, r, x);         st[L].modify(l, n, x);         if (r < n) st[R1].modify(r1, n, -x);         continue;       }       long long al = sta.query(l, l), ar = sta.query(r, r);       if (!al || !ar) {         puts( 0 );         continue;       }       if (!sta.query(l, r)) {         puts( 0 );         continue;       }       if (l == r) {         if (al != 1)           puts( 0 );         else           puts( 1 );         continue;       }       if (l + 1 == r) {         if (al == ar)           puts( 1 );         else           puts( 0 );         continue;       }       st[L1].modify(l1, n, 1ll);       st[R].modify(r, n, -1ll);       r1 = r - 1;       long long s1 = st[0].query(l1, r1), s2 = st[1].query(l1, r1);       if (L1)         s2 -= st[1].query(l - 1, l - 1), s1 -= st[0].query(l, l);       else {         if (l > 1) s1 -= st[0].query(l - 1, l - 1);         s2 -= st[1].query(l, l);       }       if (L)         s2 += al;       else         s1 += al;       if (s1 <= 0 || s2 <= 0)         puts( 0 );       else {         long long t = st[R].query(r, r);         if (R == L)           t -= st[R].query(l, l);         else if (l > 1)           t -= st[R].query(l - 1, l - 1);         if (L == R) t += al;         if (!t)           puts( 1 );         else           puts( 0 );       }       st[L1].modify(l1, n, -1ll);       st[R].modify(r, n, 1ll);     }     return 0;   }