#include <bits/stdc++.h>
using namespace std;
class sgt {
  vector<long long int> arr;
  vector<bool> inver;

 public:
  sgt() {
    arr.resize(4e5, 0), arr.assign(4e5, 0);
    inver.resize(4e5, false), inver.assign(4e5, false);
  }
  void build(long long int x, vector<long long int> &a, long long int l,
             long long int r) {
    if (l == r)
      arr[x] = a[l];
    else {
      long long int mid = (l + r) / 2;
      build(2 * x, a, l, mid);
      build(2 * x + 1, a, mid + 1, r);
      arr[x] = arr[2 * x] + arr[2 * x + 1];
    }
  }
  void push(long long int x, long long int l, long long int r) {
    inver[x] = false;
    long long int mid = (l + r) / 2;
    arr[2 * x] = mid - l + 1 - arr[2 * x];
    arr[2 * x + 1] = r - mid - arr[2 * x + 1];
    inver[2 * x] = 1 ^ inver[2 * x];
    inver[2 * x + 1] = 1 ^ inver[2 * x + 1];
  }
  void update(long long int x, long long int l, long long int r,
              long long int ql, long long int qr) {
    if (ql > qr) return;
    if (l == ql && r == qr) {
      if (inver[x])
        inver[x] = false;
      else
        inver[x] = true;
      arr[x] = qr - ql + 1 - arr[x];
    } else {
      long long int mid = (l + r) / 2;
      if (inver[x]) push(x, l, r);
      update(2 * x, l, mid, ql, min(qr, mid));
      update(2 * x + 1, mid + 1, r, max(ql, mid + 1), qr);
      arr[x] = arr[2 * x] + arr[2 * x + 1];
    }
  }
  long long int query(long long int x, long long int l, long long int r,
                      long long int ql, long long int qr, bool inv) {
    if (ql > qr) return 0;
    if (ql == l && qr == r) {
      if (inv)
        return (r - l + 1 - arr[x]);
      else
        return arr[x];
    } else {
      long long int mid = (l + r) / 2;
      long long int val1 =
          query(2 * x, l, mid, ql, min(mid, qr), (inv ^ inver[x]));
      long long int val2 =
          query(2 * x + 1, mid + 1, r, max(mid + 1, ql), qr, (inv ^ inver[x]));
      return val1 + val2;
    }
  }
};
int main() {
  ios_base::sync_with_stdio(0);
  cin.tie(0);
  long long int n, m;
  cin >> n;
  vector<long long int> arr(n);
  for (long long int i = 0; i < n; cin >> arr[i++])
    ;
  cin >> m;
  vector<sgt> trees(20);
  for (long long int i = 0; i < 20; i++) {
    vector<long long int> create(n);
    for (long long int j = 0; j < n; j++) {
      create[j] = (arr[j] & 1);
      arr[j] = (arr[j] >> 1);
    }
    trees[i].build(1, create, 0, n - 1);
  }
  while (m--) {
    long long int t, l, r, x;
    cin >> t >> l >> r;
    l--, r--;
    if (t == 1) {
      long long int ans = 0, mul = 1;
      for (long long int i = 0; i < 20; i++) {
        ans += trees[i].query(1, 0, n - 1, l, r, false) * mul;
        mul *= 2;
      }
      cout << ans << endl;
    } else {
      cin >> x;
      for (long long int i = 0; i < 20; i++) {
        long long int val = (x & 1);
        if (val == 1) trees[i].update(1, 0, n - 1, l, r);
        x = (x >> 1);
      }
    }
  }
  return 0;
}
