#include<bits/stdc++.h>
using namespace std;
const int N=1e6+10;
int a[N];
struct tree{
int d[N],b[N],k;
inline void build(int s,int t,int p){
if(s==t){d[p]=((a[s]>>k)&1);return ;}
int m=s+((t-s)>>1);
build(s,m,p*2),build(m+1,t,p*2+1);
d[p]=d[p*2]+d[p*2+1];
}
inline void update(int l,int r,int c,int s,int t,int p){
if(l<=s&&t<=r){d[p]=(c==1)?t-s+1-d[p]:d[p],b[p]=c;return ;}
int m=s+((t-s)>>1);
if(b[p]){
d[p*2]=m-s+1-d[p*2],b[p*2]=b[p];
d[p*2+1]=t-m-d[p*2+1],b[p*2+1]=b[p];
b[p]=0;
}
if(l<=m)update(l,r,c,s,m,p*2);
if(m<r) update(l,r,c,m+1,t,p*2+1);
d[p]=d[p*2]+d[p*2+1];
}
inline long long getans(int l,int r,int s,int t,int p){
if(l<=s&&t<=r){return d[p];}
int m=s+((t-s)>>1),ans=0;
if(b[p]){
d[p*2]=m-s+1-d[p*2],b[p*2]=b[p];
d[p*2+1]=t-m-d[p*2+1],b[p*2+1]=b[p];
b[p]=0;
}
if(l<=m)ans+=getans(l,r,s,m,p*2);
if(m<r) ans+=getans(l,r,m+1,t,p*2+1);
return ans;
}
}T[25];
int n,m;
int main(){
cin>>n;
for(int i=1;i<=n;i++)scanf("%d",&a[i]);
for(int i=0;i<=22;i++)T[i].k=i,T[i].build(1,n,1);
cin>>m;
for(int ll=1;ll<=m;ll++){
int op,l,r,k;scanf("%d%d%d",&op,&l,&r);
if(op==1){
long long ans=0;
for(int i=0;i<=22;i++)ans+=(((long long)(T[i].getans(l,r,1,n,1)))<<i);
printf("%lld\n",ans);
}
else{
scanf("%d",&k);
for(int i=0;i<=22;i++)T[i].update(l,r,((k>>i)&1),1,n,1);
}
}
return 0;
}