Rt,样例都没过。求助
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int N=1e5+10;
int n,m;
int op,l,r,x;
int a[N];
#define ls p<<1
#define rs p<<1|1
#define forr() for(int i=0;i<20;++i)
struct tree{
int l,r;
long long lazy;
int c[20];
}t[N<<2];
inline void pushup(int p){forr() t[p].c[i]=t[ls].c[i]+t[rs].c[i];}
inline void pushdown(int p){
if(t[p].lazy){
int mid=(t[p].l+t[p].r)>>1;
forr(){
if((t[p].lazy>>i)&1){
t[ls].c[i]=(mid-l+1)-t[ls].c[i];
t[rs].c[i]=(r-mid)-t[rs].c[i];
}
}t[ls].lazy^=t[p].lazy,t[rs].lazy^=t[p].lazy;
t[p].lazy=0;
}
}
void build(int p,int l,int r){
t[p].l=l,t[p].r=r;
if(l==r){
forr(){
if((a[l]>>i)&1) t[p].c[i]=1;
else t[p].c[i]=0;
}return ;
}
int mid=(l+r)>>1;
build(ls,l,mid);
build(rs,mid+1,r);
pushup(p);
}
void update(int p,int l,int r,int k){
// if(t[p].r<l||r<t[p].l)return ;
if(l<=t[p].l&&t[p].r<=r){
forr() if((k>>i)&1) t[p].c[i]=(t[p].r-t[p].l+1)-t[p].c[i];
t[p].lazy^=k;
return ;
}pushdown(p);
int mid=(t[p].l+t[p].r)>>1;
if(l<=mid) update(ls,l,r,k);
if(mid+1<=r) update(rs,l,r,k);
pushup(p);
}
long long query(int p,int l,int r){
// if(t[p].r<l||r<t[p].l)return 0;
if(l<=t[p].l&&t[p].r<=r){
long long res=0,pow=1;
forr() res+=pow*t[p].c[i],pow<<=1;
return res;
}pushdown(p);
long long ans=0;
int mid=(t[p].l+t[p].r)>>1;
if(l<=mid) ans+=query(ls,l,r);
if(mid+1<=r) ans+=query(rs,l,r);
return ans;
}
int main(){
scanf("%d",&n);
for(int i=1;i<=n;++i) scanf("%d",&a[i]);
build(1,1,n);
scanf("%d",&m);
while(m--){
scanf("%d%d%d",&op,&l,&r);
if(op==1){
printf("%lld\n",query(1,l,r));
}
else{
scanf("%d",&x);
update(1,l,r,x);
}
}
return 0;
}