#include <bits/stdc++.h>
using namespace std;
int n, m, l, r, t;
int a[100009];
int tree[20][1 << 18];
bool x[20][1 << 18];
void build(int v, int tl, int tr) {
  if (tl == tr) {
    for (long long(b) = (0); b < (20); ++(b))
      if (a[tl] & (1 << b)) tree[b][v] = 1;
  } else {
    int tm = (tl + tr) / 2;
    build(v * 2, tl, tm);
    build(v * 2 + 1, tm + 1, tr);
    for (long long(b) = (0); b < (20); ++(b))
      tree[b][v] = tree[b][v * 2] + tree[b][v * 2 + 1];
  }
}
long long sum(int v, int tl, int tr, int l, int r, int bit, bool rev) {
  if (l > r) return 0;
  if (l == tl && r == tr) {
    if (!rev)
      return tree[bit][v];
    else
      return tr - tl + 1 - tree[bit][v];
  }
  int tm = (tl + tr) / 2;
  return sum(v * 2, tl, tm, l, min(r, tm), bit, rev ^ x[bit][v * 2]) +
         sum(v * 2 + 1, tm + 1, tr, max(tm + 1, l), r, bit,
             rev ^ x[bit][v * 2 + 1]);
}
long long S(int l, int r) {
  long long t = 0;
  for (int b = 0; b < 20; b++) {
    long long h = sum(1, 0, n - 1, l, r, b, x[b][1]);
    if (h) t += (h << b);
  }
  return t;
}
void upd(int v, int tl, int tr, int l, int r, int t) {
  if (l > r) return;
  if (l == tl && r == tr) {
    for (int b = 0; b < 20; ++b)
      if (t & (1 << b)) x[b][v] ^= 1;
    return;
  }
  int tm = (tl + tr) / 2;
  upd(v * 2, tl, tm, l, min(r, tm), t);
  upd(v * 2 + 1, tm + 1, tr, max(tm + 1, l), r, t);
  for (long long(b) = (0); b < (20); ++(b))
    tree[b][v] = sum(v * 2, tl, tm, tl, tm, b, x[b][v * 2]) +
                 sum(v * 2 + 1, tm + 1, tr, tm + 1, tr, b, x[b][v * 2 + 1]);
  return;
}
void XOR(int t, int l, int r) { upd(1, 0, n - 1, l, r, t); }
int main() {
  scanf("%d", &n);
  for (long long(i) = (0); i < (n); ++(i)) scanf("%d", &a[i]);
  build(1, 0, n - 1);
  scanf("%d", &m);
  for (long long(ttt) = (0); ttt < (m); ++(ttt)) {
    scanf("%d%d%d", &t, &l, &r);
    --l;
    --r;
    if (t == 1) {
      cout << S(l, r) << '\n';
    } else {
      int tt;
      scanf("%d", &tt);
      XOR(tt, l, r);
    }
  }
  return 0;
}
