#include <bits/stdc++.h>
using namespace std;
template <typename T>
void read(T &x) {
  x = 0;
  int f = 1;
  char ch = getchar();
  while (!isdigit(ch)) {
    if (ch == '-') f = -1;
    ch = getchar();
  }
  while (isdigit(ch)) {
    x = x * 10 + (ch ^ 48);
    ch = getchar();
  }
  return x *= f, void();
}
template <typename T>
void ckmax(T &a, T b) {
  a = b > a ? b : a;
}
template <typename T>
void ckmin(T &a, T b) {
  a = b < a ? b : a;
}
const long long N = 1e5 + 5;
long long n, m, a[N];
struct SegmentTree {
  long long cnt[N << 2], rev[N << 2];
  inline void pushup(long long p) { cnt[p] = cnt[p << 1] + cnt[p << 1 | 1]; }
  inline void tagrev(long long p, long long l, long long r, long long k) {
    if (k) cnt[p] = (r - l + 1) - cnt[p];
    rev[p] ^= k;
  }
  inline void pushdown(long long p, long long l, long long r) {
    tagrev(p << 1, l, ((l + r) >> 1), rev[p]);
    tagrev(p << 1 | 1, ((l + r) >> 1) + 1, r, rev[p]);
    rev[p] = 0;
  }
  void modify(long long p, long long l, long long r, long long x, long long y,
              long long k) {
    if (x <= l && r <= y) return tagrev(p, l, r, k);
    pushdown(p, l, r);
    if (x <= ((l + r) >> 1)) modify(p << 1, l, ((l + r) >> 1), x, y, k);
    if (y > ((l + r) >> 1)) modify(p << 1 | 1, ((l + r) >> 1) + 1, r, x, y, k);
    pushup(p);
  }
  long long query(long long p, long long l, long long r, long long x,
                  long long y) {
    if (x <= l && r <= y) return cnt[p];
    pushdown(p, l, r);
    long long res = 0;
    if (x <= ((l + r) >> 1)) res += query(p << 1, l, ((l + r) >> 1), x, y);
    if (y > ((l + r) >> 1))
      res += query(p << 1 | 1, ((l + r) >> 1) + 1, r, x, y);
    return res;
  }
} smt[21];
signed main() {
  read(n);
  for (long long i = 1; i <= n; i++) {
    read(a[i]);
    for (long long j = 0; j <= 20; j++) {
      smt[j].modify(1, 1, n, i, i, (a[i] >> j) & 1);
    }
  }
  read(m);
  for (long long op, l, r, x; m; m--) {
    read(op);
    if (op == 1) {
      read(l), read(r);
      long long ans = 0;
      for (long long j = 0; j <= 20; j++) {
        ans += (1ll << j) * smt[j].query(1, 1, n, l, r);
      }
      printf("%lld\n", ans);
    } else {
      read(l), read(r), read(x);
      for (long long j = 0; j <= 20; j++) {
        smt[j].modify(1, 1, n, l, r, (x >> j) & 1);
      }
    }
  }
  return 0;
}
