#include <bits/stdc++.h>
using namespace std;
inline int in() {
  int x;
  scanf("%d", &x);
  return x;
}
const int N = 4e5 + 10;
const int Q = 22;
int n, arr, q;
struct segment {
  int seg[4 * N];
  bool lazy[4 * N];
  void shift(int idx, int l, int r) {
    if (!lazy[idx]) return;
    int m = (l + r) / 2;
    lazy[idx * 2 + 0] ^= 1;
    lazy[idx * 2 + 1] ^= 1;
    seg[idx * 2 + 0] = (m - l) - seg[idx * 2 + 0];
    seg[idx * 2 + 1] = (r - m) - seg[idx * 2 + 1];
    lazy[idx] = 0;
  }
  int get(int ql, int qr, int l = 0, int r = n, int idx = 1) {
    if (r <= ql || qr <= l) return 0;
    if (ql <= l && r <= qr) return seg[idx];
    shift(idx, l, r);
    int ret = 0, mid = (l + r) / 2;
    ret += get(ql, qr, l, mid, idx * 2 + 0);
    ret += get(ql, qr, mid, r, idx * 2 + 1);
    return ret;
  }
  void upd(int ql, int qr, int l = 0, int r = n, int idx = 1) {
    if (r <= ql || qr <= l) return;
    if (ql <= l && r <= qr) {
      seg[idx] = (r - l) - seg[idx];
      lazy[idx] ^= 1;
      return;
    }
    shift(idx, l, r);
    int mid = (l + r) / 2;
    upd(ql, qr, l, mid, idx * 2 + 0);
    upd(ql, qr, mid, r, idx * 2 + 1);
    seg[idx] = seg[idx * 2 + 0] + seg[idx * 2 + 1];
  }
};
segment a[Q];
int main() {
  n = in();
  for (int i = 0; i < n; i++) {
    arr = in();
    for (int j = 0; j < Q; j++) {
      if (!((1 << j) & arr)) continue;
      a[j].upd(i, i + 1);
    }
  }
  q = in();
  while (q--) {
    int t = in(), l = in(), r = in();
    t--;
    l--;
    if (!t) {
      long long ret = 0, k = 0;
      for (long long i = 0; i < Q; i++) {
        k = a[i].get(l, r);
        ret += (long long)(1LL << i) * k;
      }
      cout << ret << endl;
      continue;
    }
    int x = in();
    for (int i = 0; i < Q; i++) {
      if (!(x & (1 << i))) continue;
      a[i].upd(l, r);
    }
  }
  return 0;
}
