#include <bits/stdc++.h>
using namespace std;
const int block = 320;
const int logn = 21;
const int maxn = 1e5 + 10;
int f[block][logn];
int sl[block];
int n, m, a[maxn], lazy[block];
int getX(int x) { return x / block; }
int getY(int x) { return x % block; }
int getbit(int x, int k) { return (x & (1 << k)) >> k; }
void init(int x, int val) {
  for (int i = 0; i < 20; i++) {
    if (getbit(val, i)) f[x][i]++;
  }
}
void updateBlock(int bl) {
  memset(f[bl], 0, sizeof(f[bl]));
  for (int i = bl * block; i < min(n, (bl + 1) * block); i++) {
    init(bl, a[i]);
  }
}
void update(int u, int v, int x) {
  int bl1 = getX(u);
  int bl2 = getX(v);
  if (bl1 == bl2) {
    for (int i = bl1 * block; i < (bl1 + 1) * block; i++) {
      a[i] ^= lazy[bl1];
    }
    lazy[bl1] = 0;
    for (int i = u; i <= v; i++) {
      a[i] ^= x;
    }
    updateBlock(bl1);
  } else {
    for (int i = bl1 + 1; i < bl2; i++) {
      lazy[i] ^= x;
      for (int j = 0; j < 20; j++) {
        int k = getbit(x, j);
        int cnt = sl[i];
        if (k) {
          f[i][j] = cnt - f[i][j];
        }
      }
    }
    for (int i = bl1 * block; i < (bl1 + 1) * block; i++) {
      a[i] ^= lazy[bl1];
    }
    lazy[bl1] = 0;
    for (int i = u; i < (bl1 + 1) * block; i++) {
      a[i] ^= x;
    }
    updateBlock(bl1);
    for (int i = bl2 * block; i < min(n, (bl2 + 1) * block); i++) {
      a[i] ^= lazy[bl2];
    }
    lazy[bl2] = 0;
    for (int i = bl2 * block; i <= v; i++) {
      a[i] ^= x;
    }
    updateBlock(bl2);
  }
}
long long get(int u, int v) {
  int bl1 = getX(u);
  int bl2 = getX(v);
  long long ans = 0;
  if (bl1 == bl2) {
    for (int i = u; i <= v; i++) {
      ans += (a[i] ^ lazy[bl1]);
    }
  } else {
    for (int i = bl1 + 1; i < bl2; i++) {
      for (int j = 0; j < 20; j++) {
        ans += 1ll * (1 << j) * f[i][j];
      }
    }
    for (int i = u; i < (bl1 + 1) * block; i++) {
      ans += a[i] ^ lazy[bl1];
    }
    for (int i = bl2 * block; i <= v; i++) {
      ans += a[i] ^ lazy[bl2];
    }
  }
  return ans;
}
int main() {
  scanf("%d", &n);
  for (int i = 0; i < n; i++) {
    scanf("%d", &a[i]);
    init(getX(i), a[i]);
    sl[getX(i)]++;
  }
  scanf("%d", &m);
  int k, u, v, x;
  while (m--) {
    scanf("%d %d %d", &k, &u, &v);
    u--;
    v--;
    if (k == 2) {
      scanf("%d", &x);
      update(u, v, x);
    } else {
      printf("%I64d\n", get(u, v));
    }
  }
  return 0;
}
