#include <bits/stdc++.h>
using namespace std;
const long long inf = 1e17;
const long long N = 1e5 + 100;
const long long bits = 21;
const long long mod = 1e9 + 7;
const long double pi = 3.14159265358979323846;
long long tree[bits][4 * N], lazy[bits][4 * N], arr[N], power[bits];
void build(long long ss, long long se, long long si) {
  if (ss == se) {
    for (int in = 0; in < bits; in++) {
      if (arr[ss] & power[in]) {
        tree[in][si] = 1;
      }
    }
    return;
  }
  long long mid = (ss + se) / 2;
  build(ss, mid, 2 * si + 1);
  build(mid + 1, se, 2 * si + 2);
  for (int in = 0; in < bits; in++)
    tree[in][si] = tree[in][2 * si + 1] + tree[in][2 * si + 2];
}
void pushdown(long long in, long long si, long long ss, long long se) {
  if (lazy[in][si]) {
    tree[in][si] = (se - ss + 1 - tree[in][si]);
    if (ss != se) {
      lazy[in][2 * si + 1] ^= lazy[in][si];
      lazy[in][2 * si + 2] ^= lazy[in][si];
    }
    lazy[in][si] = 0;
  }
}
long long query(long long in, long long qs, long long qe, long long ss,
                long long se, long long si) {
  pushdown(in, si, ss, se);
  if (qs > se || qe < ss) {
    return 0;
  }
  if (ss >= qs && se <= qe) {
    return tree[in][si];
  }
  long long mid = (se + ss) / 2;
  return query(in, qs, qe, ss, mid, 2 * si + 1) +
         query(in, qs, qe, mid + 1, se, 2 * si + 2);
}
void upd(long long in, long long qs, long long qe, long long ss, long long se,
         long long si) {
  pushdown(in, si, ss, se);
  if (qs > se || qe < ss) {
    return;
  }
  if (ss >= qs && se <= qe) {
    lazy[in][si] ^= 1;
    pushdown(in, si, ss, se);
    return;
  }
  long long mid = (se + ss) / 2;
  upd(in, qs, qe, ss, mid, 2 * si + 1);
  upd(in, qs, qe, mid + 1, se, 2 * si + 2);
  tree[in][si] = tree[in][2 * si + 1] + tree[in][2 * si + 2];
}
int main() {
  ios_base::sync_with_stdio(false);
  cin.tie(NULL);
  cout.tie(NULL);
  ;
  std::cout << std::fixed << std::setprecision(20);
  ;
  long long n, m, l, r, q, t;
  cin >> n;
  power[0] = 1;
  for (int i = 1; i < bits; i++) power[i] = 2 * power[i - 1];
  for (int i = 0; i < n; i++) cin >> arr[i];
  build(0, n - 1, 0);
  cin >> m;
  for (int i = 0; i < m; i++) {
    cin >> t;
    if (t == 1) {
      cin >> l >> r;
      l--, r--;
      long long ans = 0;
      for (long long in = 0; in < bits; in++) {
        ans += power[in] * query(in, l, r, 0, n - 1, 0);
      }
      cout << ans << "\n";
    } else {
      cin >> l >> r >> q;
      l--;
      r--;
      for (long long in = 0; in < bits; in++) {
        if (q & power[in]) upd(in, l, r, 0, n - 1, 0);
      }
    }
  }
}
