代码作者 @ALL_FallsDown, 他让我发帖
悬赏关注
#include<bits/stdc++.h>
#define int long long
using namespace std;
int n,tree[1000005],a[100005],m,f[1000005];
void build(int x,int y,int p){
if(x==y){
tree[p]=a[x];
return ;
}
int mid=(x+y)/2;
build(x,mid,p*2);
build(mid+1,y,p*2+1);
tree[p]=tree[p*2]+tree[p*2+1];
}
void change(int x,int y,int s,int t,int w,int p){
if(x>=s&&y<=t){
f[p]^=w;
return ;
}
if(f[p]!=0){
f[p*2]^=f[p];
f[p*2+1]^=f[p];
f[p]=0;
}
int mid=(x+y)/2;
if(mid>=s) change(x,mid,s,t,w,p*2);
if(mid<t) change(mid+1,y,s,t,w,p*2+1);
}
int find(int x,int y,int s,int t,int p){
if(x==y){
if(f[p]!=0){tree[p]^=f[p]; f[p]=0;}
return tree[p];
}
if(f[p]!=0){
f[p*2]^=f[p];
f[p*2+1]^=f[p];
f[p]=0;
}
int mid=(x+y)/2,sum=0;
if(mid>=s) sum=find(x,mid,s,t,p*2);
if(mid<t) sum+=find(mid+1,y,s,t,p*2+1);
return sum;
}
signed main(){
cin>>n;
for(int i=1;i<=n;i++){
cin>>a[i];
}
build(1,n,1);
cin>>m;
for(int i=1;i<=m;i++){
int k;
cin>>k;
if(k==1){
int l,r;
cin>>l>>r;
cout<<find(1,n,l,r,1)<<endl;
}
if(k==2){
int l,r,x;
cin>>l>>r>>x;
change(1,n,l,r,x,1);
}
}
return 0;
}