CF242E
用scanf会WA,用cin会MLE
MnZn调了一下午了,求助大佬
#include<cstdio>
#include<iostream>
#define int long long
using namespace std;
const int M=1e5+10;
int n,m,a[M];
struct node{
int l,r,val;
bool lazy;
}tr[M<<2][21];
void pushup(int k,int ch){
tr[k][ch].val=tr[k<<1][ch].val+tr[k<<1|1][ch].val;
}
void pushdown(int k,int ch){
if(tr[k][ch].lazy){
tr[k<<1][ch].lazy=!tr[k<<1][ch].lazy;
tr[k<<1|1][ch].lazy=!tr[k<<1|1][ch].lazy;
tr[k<<1][ch].val=(tr[k<<1][ch].r-tr[k<<1][ch].l+1)-tr[k<<1][ch].val;
tr[k<<1|1][ch].val=(tr[k<<1|1][ch].r-tr[k<<1|1][ch].l+1)-tr[k<<1|1][ch].val;
tr[k][ch].lazy=!tr[k][ch].lazy;
}
}
void build(int k,int l,int r,int ch){
tr[k][ch].l=l,tr[k][ch].r=r;
if(l==r){
tr[k][ch].val=((a[l]&(1<<ch))!=0);
tr[k][ch].lazy=false;
return;
}
int mid=(l+r)>>1;
build(k<<1,l,mid,ch);
build(k<<1|1,mid+1,r,ch);
pushup(k,ch);
}
void update(int k,int l,int r,int ch){
if(l<=tr[k][ch].l&&tr[k][ch].r<=r){
tr[k][ch].lazy=!tr[k][ch].lazy;
tr[k][ch].val=(tr[k][ch].r-tr[k][ch].l+1)-tr[k][ch].val;
return;
}
pushdown(k,ch);
int mid=(tr[k][ch].l+tr[k][ch].r)>>1;
if(l<=mid) update(k<<1,l,r,ch);
if(r>mid) update(k<<1|1,l,r,ch);
pushup(k,ch);
}
int query(int k,int l,int r,int ch){
if(l<=tr[k][ch].l&&tr[k][ch].r<=r) return tr[k][ch].val;
pushdown(k,ch);
int mid=(tr[k][ch].l+tr[k][ch].r)>>1,ans=0;
if(l<=mid) ans+=query(k<<1,l,r,ch);
if(r>mid) ans+=query(k<<1|1,l,r,ch);
return ans;
}
signed main(){
cin>>n;
for(int i=1;i<=n;i++) cin>>a[i];
for(int i=0;i<=20;i++) build(1,1,n,i);
cin>>m;
while(m--){
int opt,l,r,x;
cin>>opt;
if(opt==1){
cin>>l>>r;
int sum=0;
for(int i=0;i<=20;i++) sum+=(1<<i)*query(1,l,r,i);
cout<<sum<<endl;
}
if(opt==2){
cin>>l>>r>>x;
for(int i=0;i<=20;i++)
if((x&(1<<i))!=0) update(1,l,r,i);
}
}
return 0;
}