#include <bits/stdc++.h>
#pragma GCC optimize("Ofast")
using namespace std;
struct Node {
  static long long const neutro = 0;
  static long long op(long long x, long long y) { return x + y; }
  static long long lazy_op(int i, int j, long long x) { return (j - i + 1); }
};
template <class t>
class STL {
  vector<long long> arr, st, lazy;
  int n;
  void build(int u, int i, int j) {
    if (i == j) {
      st[u] = arr[i];
      return;
    }
    int m = (i + j) / 2, l = u * 2 + 1, r = u * 2 + 2;
    build(l, i, m);
    build(r, m + 1, j);
    st[u] = t::op(st[l], st[r]);
  }
  void propagate(int u, int i, int j, long long x) {
    st[u] = t::lazy_op(i, j, x) - st[u];
    if (i != j) {
      lazy[u * 2 + 1] ^= 1;
      lazy[u * 2 + 2] ^= 1;
    }
    lazy[u] = 0;
  }
  long long query(int a, int b, int u, int i, int j) {
    if (j < a or b < i) return t::neutro;
    int m = (i + j) / 2, l = u * 2 + 1, r = u * 2 + 2;
    if (lazy[u]) propagate(u, i, j, lazy[u]);
    if (a <= i and j <= b) return st[u];
    long long x = query(a, b, l, i, m);
    long long y = query(a, b, r, m + 1, j);
    return t::op(x, y);
  }
  void update(int a, int b, long long value, int u, int i, int j) {
    int m = (i + j) / 2, l = u * 2 + 1, r = u * 2 + 2;
    if (lazy[u]) propagate(u, i, j, lazy[u]);
    if (a <= i and j <= b)
      propagate(u, i, j, value);
    else if (j < a or b < i)
      return;
    else {
      update(a, b, value, l, i, m);
      update(a, b, value, r, m + 1, j);
      st[u] = t::op(st[l], st[r]);
    }
  }

 public:
  STL(vector<long long> &v) {
    arr = v;
    n = v.size();
    st.resize(n * 4 + 5);
    lazy.assign(n * 4 + 5, 0);
    build(0, 0, n - 1);
  }
  long long query(int a, int b) { return query(a, b, 0, 0, n - 1); }
  void update(int a, int b, long long value) {
    update(a, b, value, 0, 0, n - 1);
  }
};
int main() {
  ios::sync_with_stdio(false);
  cin.tie(0);
  cout.tie(0);
  int n;
  cin >> n;
  int log = 21;
  vector<vector<long long>> A(log, vector<long long>(n));
  for (int i = 0; i < n; ++i) {
    int aux;
    cin >> aux;
    for (int j = 0; j < log; ++j) {
      if (aux & (1ll << j))
        A[j][i] = 1;
      else
        A[j][i] = 0;
    }
  }
  vector<STL<Node>> S;
  for (int k = 0; k < log; ++k) {
    S.push_back(STL<Node>(A[k]));
  }
  int q;
  cin >> q;
  for (int j = 0; j < q; ++j) {
    int t, l, r;
    cin >> t >> l >> r;
    l--, r--;
    if (t == 1) {
      long long rsv = 0;
      long long ans = 0;
      for (int i = 0; i < 63; ++i) {
        long long res = rsv;
        if (i < log) res += S[i].query(l, r);
        if (res % 2) ans += (1ll << i);
        rsv = res / 2;
      }
      cout << ans << "\n";
    } else {
      int x;
      cin >> x;
      for (int i = 0; i < log; ++i) {
        if ((1ll << i) & x) S[i].update(l, r, 1);
      }
    }
  }
}
