#include <bits/stdc++.h>
const int H = 61;
const int N = 100000 + 10;
struct node {
  int val[H], len;
  long long Xor;
} seg[N << 2];
void Up(node& fa, node& ls, node& rs) {
  for (int i = 0; i < H; ++i) fa.val[i] = ls.val[i] + rs.val[i];
}
void Down(node& fa, node& ls, node& rs) {
  if (fa.Xor > 0) {
    for (int i = 0; i < H; ++i)
      if (fa.Xor >> i & 1) {
        ls.val[i] = ls.len - ls.val[i];
        rs.val[i] = rs.len - rs.val[i];
      }
    ls.Xor ^= fa.Xor;
    rs.Xor ^= fa.Xor;
    fa.Xor = 0;
  }
}
void build(int l, int r, int rt) {
  seg[rt].Xor = 0;
  seg[rt].len = r - l + 1;
  if (l == r) {
    long long x;
    scanf("%I64d", &x);
    for (int i = 0; i < H; ++i)
      if (x >> i & 1)
        seg[rt].val[i] = 1;
      else
        seg[rt].val[i] = 0;
    return;
  }
  int mid = (l + r) >> 1;
  build(l, mid, rt << 1);
  build(mid + 1, r, rt << 1 | 1);
  Up(seg[rt], seg[rt << 1], seg[rt << 1 | 1]);
}
void update(int L, int R, long long v, int l, int r, int rt) {
  if (L <= l && R >= r) {
    for (int i = 0; i < H; ++i)
      if (v >> i & 1) seg[rt].val[i] = seg[rt].len - seg[rt].val[i];
    seg[rt].Xor ^= v;
    return;
  }
  int mid = (l + r) >> 1;
  Down(seg[rt], seg[rt << 1], seg[rt << 1 | 1]);
  if (R <= mid)
    update(L, R, v, l, mid, rt << 1);
  else if (L > mid)
    update(L, R, v, mid + 1, r, rt << 1 | 1);
  else {
    update(L, mid, v, l, mid, rt << 1);
    update(mid + 1, R, v, mid + 1, r, rt << 1 | 1);
  }
  Up(seg[rt], seg[rt << 1], seg[rt << 1 | 1]);
}
long long query(int L, int R, int l, int r, int rt) {
  if (L <= l && R >= r) {
    long long re = 0;
    for (int i = 0; i < H; ++i) re = re + seg[rt].val[i] * (1ll << i);
    return re;
  }
  int mid = (l + r) >> 1;
  Down(seg[rt], seg[rt << 1], seg[rt << 1 | 1]);
  if (R <= mid)
    return query(L, R, l, mid, rt << 1);
  else if (L > mid)
    return query(L, R, mid + 1, r, rt << 1 | 1);
  else
    return query(L, mid, l, mid, rt << 1) +
           query(mid + 1, R, mid + 1, r, rt << 1 | 1);
}
int main() {
  int n;
  scanf("%d", &n);
  build(1, n, 1);
  int Q, typ, l, r, x;
  scanf("%d", &Q);
  while (Q-- > 0) {
    scanf("%d", &typ);
    if (1 == typ) {
      scanf("%d%d", &l, &r);
      printf("%I64d\n", query(l, r, 1, n, 1));
    } else {
      scanf("%d%d%d", &l, &r, &x);
      update(l, r, x, 1, n, 1);
    }
  }
  return 0;
}
