#include <bits/stdc++.h>
using namespace std;
struct info {
  long long one, zero;
  info() { one = zero = 0; }
  info(long long a, long long b) {
    one = a;
    zero = b;
  }
};
struct SEG {
  long long n;
  vector<info> a, tree;
  vector<long long> lazy;
  SEG() {}
  void init(vector<info> a) {
    this->a = a;
    n = a.size();
    tree.resize(4 * n);
    lazy.resize(4 * n);
  }
  void bld(long long node, long long si, long long ei) {
    if (si == ei) {
      tree[node] = a[si];
      return;
    }
    long long mid = (si + ei) / 2;
    bld(2 * node, si, mid);
    bld(2 * node + 1, mid + 1, ei);
    tree[node].one = tree[2 * node].one + tree[2 * node + 1].one;
    tree[node].zero = tree[2 * node].zero + tree[2 * node + 1].zero;
  }
  void bld() { bld(1, 0, n - 1); }
  void push(long long si, long long ei, long long node) {
    if (lazy[node]) {
      if (lazy[node] & 1) swap(tree[node].one, tree[node].zero);
      if (si != ei) {
        lazy[2 * node] += lazy[node];
        lazy[2 * node + 1] += lazy[node];
      }
      lazy[node] = 0;
    }
  }
  void up(long long l, long long r, long long node, long long si,
          long long ei) {
    push(si, ei, node);
    if (l > ei || r < si) return;
    if (l <= si && r >= ei) {
      swap(tree[node].one, tree[node].zero);
      if (si != ei) {
        lazy[2 * node] += lazy[node] + 1;
        lazy[2 * node + 1] += lazy[node] + 1;
      }
      return;
    }
    long long mid = (si + ei) / 2;
    up(l, r, 2 * node, si, mid);
    up(l, r, 2 * node + 1, mid + 1, ei);
    tree[node].one = tree[2 * node].one + tree[2 * node + 1].one;
    tree[node].zero = tree[2 * node].zero + tree[2 * node + 1].zero;
  }
  void up(long long l, long long r) { up(l, r, 1, 0, n - 1); }
  info qry(long long l, long long r, long long node, long long si,
           long long ei) {
    if (l > ei || r < si) return {0, 0};
    push(si, ei, node);
    if (l <= si && r >= ei) {
      return tree[node];
    }
    long long mid = (si + ei) / 2;
    info L = qry(l, r, 2 * node, si, mid);
    info R = qry(l, r, 2 * node + 1, mid + 1, ei);
    info res({L.one + R.one, L.zero + R.zero});
    return res;
  }
  long long qry(long long l, long long r) {
    info res = qry(l, r, 1, 0, n - 1);
    return res.one;
  }
};
int32_t main() {
  long long n;
  cin >> n;
  vector<long long> a(n);
  for (long long i = 0; i < n; i++) {
    cin >> a[i];
  }
  vector<SEG> seg(20);
  for (long long bit = 0; bit < 20; bit++) {
    vector<info> temp(n);
    for (long long i = 0; i < n; i++) {
      if (a[i] & (1ll << bit)) {
        temp[i].one++;
      } else {
        temp[i].zero++;
      }
    }
    seg[bit].init(temp);
    seg[bit].bld();
  }
  long long q;
  cin >> q;
  while (q--) {
    long long c;
    cin >> c;
    if (c == 1) {
      long long l, r;
      cin >> l >> r;
      l--, r--;
      long long res = 0;
      for (long long bit = 0; bit < 20; bit++) {
        long long cnt = seg[bit].qry(l, r);
        res += cnt * (1ll << bit);
      }
      cout << res << endl;
    } else {
      long long l, r, x;
      cin >> l >> r >> x;
      l--, r--;
      for (long long i = 0; i < 20; i++) {
        if (x & (1ll << i)) {
          seg[i].up(l, r);
        }
      }
    }
  }
}
