#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int N = 1e5+5;
struct node{
int ls, rs;
int key, pri, siz;
int lazy;
int val;
int sum;
}treap[N * 20];
int tsiz = 0, root[25];
void update(int rt){
treap[rt].siz = treap[treap[rt].ls].siz + treap[treap[rt].rs].siz + 1;
treap[rt].sum = treap[rt].val + treap[treap[rt].ls].sum + treap[treap[rt].rs].sum;
}
void pushdown(int x){
if (x && treap[x].lazy){
treap[treap[x].ls].lazy ^= treap[x].lazy;
treap[treap[x].rs].lazy ^= treap[x].lazy;
treap[treap[x].ls].val ^= treap[x].lazy;
treap[treap[x].rs].val ^= treap[x].lazy;
treap[treap[x].ls].sum = treap[treap[x].ls].siz - treap[treap[x].ls].sum;
treap[treap[x].rs].sum = treap[treap[x].rs].siz - treap[treap[x].rs].sum;
treap[x].lazy = 0;
}
}
void newnode(int x, int v){
++tsiz;
treap[tsiz].siz = 1;
treap[tsiz].ls = treap[tsiz].rs = 0;
treap[tsiz].key = x;
treap[tsiz].pri = rand();
treap[tsiz].val = v;
treap[tsiz].lazy = 0;
}
void split(int rt, int x, int &l, int &r){
if (rt == 0){
l = r = 0;
return;
}
pushdown(rt);
if (treap[treap[rt].ls].siz < x) l = rt, split(treap[rt].rs, x - treap[treap[rt].ls].siz - 1, treap[rt].rs, r);
else r = rt, split(treap[rt].ls, x, l, treap[rt].ls);
update(rt);
}
int merge(int l, int r){
if (l == 0 || r == 0) return l + r;
if (treap[l].pri > treap[r].pri){
pushdown(l);
treap[l].rs = merge(treap[l].rs, r);
update(l);
return l;
}
else{
pushdown(r);
treap[r].ls = merge(l, treap[r].ls);
update(r);
return r;
}
}
int insert(int rt, int x, int v){
int l, r;
split(root[rt], x, l, r);
newnode(x, v);
root[rt] = merge(merge(l, tsiz), r);
return tsiz;
}
void print(int x){
if (!x) return;
pushdown(x);
print(treap[x].ls);
cout << treap[x].key << ' ';
print(treap[x].rs);
}
void add(int rt, int l, int r, int x){
int a, b, c;
split(root[rt], l - 1, a, b);
split(b, r - l + 1, b, c);
treap[b].lazy ^= x;
treap[b].val ^= x;
if (x) treap[b].sum = treap[b].siz - treap[b].sum;
root[rt] = merge(a, merge(b, c));
}
int query(int rt, int l, int r){
int a, b, c;
split(root[rt], l - 1, a, b);
split(b, r - l + 1, b, c);
ll ans = treap[b].sum;
root[rt] = merge(a, merge(b, c));
return ans;
}
int n, q;
signed main(){
ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);
srand(time(NULL));
cin >> n;
for (int i = 1;i <= n;i++){
int v;
cin >> v;
for (int j = 1;j <= 20;j++){
int a = ((v >> (j - 1)) & 1);
insert(j, i, a);
}
}
cin >> q;
while (q--){
int op, l, r, k;
cin >> op >> l >> r;
if (op == 1){
ll ans = 0;
for (int i = 1;i <= 20;++i){
ll a = query(i, l, r);
ans += (1 << (i - 1)) * a;
}
cout << ans << '\n';
}
else{
cin >> k;
for (int i = 1;i <= 20;++i){
int a = ((k >> (i - 1)) & 1);
if (a) add(i, l, r, a);
}
}
}
return 0;
}