#include <bits/stdc++.h>
using namespace std;
long long a[100005];
class SegmentTree {
 public:
  int sum[100005 << 2];
  bool Xor[100005 << 2];
  void PushUp(int rt) { sum[rt] = sum[rt << 1] + sum[rt << 1 | 1]; }
  void PushDown(int rt, int m) {
    if (Xor[rt]) {
      Xor[rt << 1] ^= Xor[rt];
      Xor[rt << 1 | 1] ^= Xor[rt];
      sum[rt << 1] = m - (m >> 1) - sum[rt << 1];
      sum[rt << 1 | 1] = (m >> 1) - sum[rt << 1 | 1];
      Xor[rt] = 0;
    }
  }
  void Build(int l, int r, int rt, int bit) {
    Xor[rt] = 0;
    if (l == r) {
      sum[rt] = (a[l] & (1LL << bit)) > 0;
      return;
    }
    int m = (l + r) >> 1;
    Build(l, m, rt << 1, bit);
    Build(m + 1, r, rt << 1 | 1, bit);
    PushUp(rt);
  }
  void Update(int L, int R, int l, int r, int rt) {
    if (L <= l && R >= r) {
      sum[rt] = r - l + 1 - sum[rt];
      Xor[rt] ^= 1;
      return;
    }
    PushDown(rt, r - l + 1);
    int m = (l + r) >> 1;
    if (L <= m) Update(L, R, l, m, rt << 1);
    if (R > m) Update(L, R, m + 1, r, rt << 1 | 1);
    PushUp(rt);
  }
  int Query(int L, int R, int l, int r, int rt) {
    int ans = 0;
    if (L <= l && R >= r) return sum[rt];
    PushDown(rt, r - l + 1);
    int m = (l + r) >> 1;
    if (L <= m) ans += Query(L, R, l, m, rt << 1);
    if (R > m) ans += Query(L, R, m + 1, r, rt << 1 | 1);
    PushUp(rt);
    return ans;
  }
} Tree[25];
int main() {
  int i, j, n, m, l, r, op;
  long long ans, x;
  while (scanf("%d", &n) != EOF) {
    for (i = 1; i <= n; i++) scanf("%I64d", &a[i]);
    for (i = 20; i >= 0; i--) Tree[i].Build(1, n, 1, i);
    scanf("%d", &m);
    for (i = 1; i <= m; i++) {
      scanf("%d", &op);
      if (op == 1) {
        scanf("%d%d", &l, &r);
        ans = 0;
        for (j = 20; j >= 0; j--)
          ans += (1LL << j) * Tree[j].Query(l, r, 1, n, 1);
        printf("%I64d\n", ans);
      } else {
        scanf("%d%d%I64d", &l, &r, &x);
        for (j = 20; j >= 0; j--)
          if (x & (1LL << j)) Tree[j].Update(l, r, 1, n, 1);
      }
    }
  }
  return 0;
}
