#include <bits/stdc++.h>
using namespace std;
const long long EPS = (long long)5e18;
const int eps = 1e9 + 7;
const long double inf = 1e-10;
const int size_ = 21;
vector<long long> P(size_);
class ST {
 private:
  int len;
  vector<pair<long long, long long> > T;
  vector<long long> Upd;
  void log2(int r) {
    len = 1;
    while (len < r) {
      len <<= 1;
    }
  }
  void build(vector<int> &A) {
    log2(A.size());
    for (int i = len; i < len + A.size(); ++i) {
      T[i].first = A[i - len];
      T[i].second = 1;
    }
    for (int i = len - 1; i > 0; --i) {
      T[i].first = T[i * 2].first + T[i * 2 + 1].first;
      T[i].second = T[i * 2].second + T[i * 2 + 1].second;
    }
  }
  void push(int ind, int tl, int tr) {
    if (tl != tr) {
      Upd[ind * 2] ^= Upd[ind];
      Upd[ind * 2 + 1] ^= Upd[ind];
    }
    if (Upd[ind]) {
      T[ind].first = T[ind].second - T[ind].first;
    }
    Upd[ind] = 0;
  }
  void update(int ind, int v, int tl, int tr, int l, int r) {
    push(ind, tl, tr);
    if (tr < l || tl > r) {
      return;
    }
    if (l <= tl && tr <= r) {
      Upd[ind] = v;
      push(ind, tl, tr);
      return;
    }
    int tm = (tr + tl) >> 1;
    update(ind * 2, v, tl, tm, l, r);
    update(ind * 2 + 1, v, tm + 1, tr, l, r);
    T[ind].first = T[ind * 2].first + T[ind * 2 + 1].first;
  }
  long long query(int ind, int tl, int tr, int l, int r) {
    push(ind, tl, tr);
    if (tr < l || tl > r) {
      return 0;
    }
    if (l <= tl && tr <= r) {
      return T[ind].first;
    }
    int tm = (tr + tl) >> 1;
    return query(ind * 2, tl, tm, l, r) + query(ind * 2 + 1, tm + 1, tr, l, r);
  }

 public:
  void build(vector<long long> &A) {
    log2(A.size());
    T.resize(len * 2);
    Upd.resize(len * 2);
    for (int i = len; i < len + A.size(); ++i) {
      T[i].first = A[i - len];
      T[i].second = 1;
    }
    for (int i = len - 1; i > 0; --i) {
      T[i].first = T[i * 2].first + T[i * 2 + 1].first;
      T[i].second = T[i * 2].second + T[i * 2 + 1].second;
    }
  }
  void update(int left, int right, int t) {
    update(1, t, len, len * 2 - 1, left + len - 1, right + len - 1);
  }
  long long query(int left, int right) {
    return query(1, len, len * 2 - 1, left + len - 1, right + len - 1);
  }
};
vector<ST> A(size_);
int main() {
  ios::sync_with_stdio(0);
  cin.tie(0);
  cout.tie(0);
  int p = 1;
  for (int i = 0; i < P.size(); ++i) {
    P[i] = p;
    p <<= 1;
  }
  int n;
  cin >> n;
  vector<long long> D(n);
  vector<bitset<size_> > C(n);
  for (int i = 0; i < n; ++i) {
    cin >> D[i];
    C[i] = D[i];
  }
  for (int i = 0; i < size_; ++i) {
    vector<long long> B(n);
    for (int j = 0; j < n; ++j) {
      B[j] = C[j][i];
    }
    A[i].build(B);
  }
  int m;
  cin >> m;
  for (int i = 0; i < m; ++i) {
    int t;
    cin >> t;
    if (t == 1) {
      long long l, r;
      cin >> l >> r;
      long long res = 0;
      for (int j = 0; j < size_; ++j) {
        res += A[j].query(l, r) * P[j];
      }
      cout << res << endl;
    } else if (t == 2) {
      long long l, r, first;
      cin >> l >> r >> first;
      bitset<size_> a(first);
      for (int j = 0; j < size_; ++j) {
        A[j].update(l, r, a[j]);
      }
    }
  }
  return 0;
}
