RT,似乎是执行op1的时候出的。
#include<bits/stdc++.h>
using namespace std;
const int INF=INT_MAX;
struct node{
node(int l=0,int r=0,int v=0,int fm=0,int nm=0,int sm=0,int la=0,int k=0):l(l),r(r),v(v),fm(fm),nm(nm),sm(sm),la(la){
memset(b,k,sizeof(b));
}
int l,r,v,fm,nm,sm,la,b[50];
}f[400010];
int n,q,b[50],a[200010];
void chg(node&k,int x,int y){
for(int i=0;i<30;i++)
k.b[i]+=((y>>i&1)-(x>>i&1))*k.nm;
return;
}
void pd(node&k,int la){
if(k.fm>=la)
return;
chg(k,k.fm,la);
if(k.nm&1)
k.v^=k.fm^la;
k.fm=k.la=la;
return;
}
void pd(int x){
if(f[x].la==-1)
return;
pd(f[x<<1],f[x].la),pd(f[x<<1|1],f[x].la);
f[x].la=-1;
return;
}
void pu(int x){
f[x].v=f[x<<1].v^f[x<<1|1].v;
for(int i=0;i<30;i++)
f[x].b[i]=f[x<<1].b[i]+f[x<<1|1].b[i];
if(f[x<<1].fm==f[x<<1|1].fm)
f[x].fm=f[x<<1].fm,f[x].nm=f[x<<1].nm+f[x<<1|1].nm,f[x].sm=min(f[x<<1].sm,f[x<<1|1].sm);
else{
bool k=f[x<<1|1].fm<f[x<<1].fm;
f[x].fm=f[x<<1|k].fm,f[x].nm=f[x<<1|k].nm,f[x].sm=min(f[x<<1|k].sm,f[x<<1|(k^1)].fm);
}
return;
}
void bld(int l,int r,int x=1){
f[x]=node(l,r,a[l],a[l],1,INF,-1);
if(l==r){
chg(f[x],0,a[l]);
return;
}
int mid=l+r>>1;
return bld(l,mid,x<<1),bld(mid+1,r,x<<1|1),pu(x);
}
void mdf(int l,int r,int c,int x=1){
if(f[x].fm>=c)
return;
if(l<=f[x].l&&f[x].r<=r&&c<=f[x].sm)
return pd(f[x],c);
pd(x);
int mid=f[x].l+f[x].r>>1;
if(l<=mid)
mdf(l,r,c,x<<1);
if(mid<r)
mdf(l,r,c,x<<1|1);
return pu(x);
}
int qry(int l,int r,int x=1){
if(l<=f[x].l&&f[x].r<=r){
for(int i=0;i<30;i++)
b[i]+=f[x].b[i];
return f[x].v;
}
pd(x);
int ret=0,mid=f[x].l+f[x].r>>1;
if(l<=mid)
ret^=qry(l,r,x<<1);
if(mid<r)
ret^=qry(l,r,x<<1|1);
return ret;
}
int main(){
cin>>n>>q;
for(int i=1;i<=n;i++)
cin>>a[i];
bld(1,n);
for(int op,l,r,x;q--;){
cin>>op>>l>>r>>x;
if(op==1){
mdf(l,r,x);
continue;
}
memset(b,0,sizeof(b));
int xs=qry(l,r)^x;
if(!xs){
cout<<"0\n";
continue;
}
int t=log2(xs);
cout<<b[t]+((x>>t)&1)<<'\n';
}
return 0;
}