#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
ull n=0,m=0,a=0,b=0,x=0,opt=0;
struct node{
ull l,r,mid,val[64],tag;
node*l_s,*r_s;
static ull l_fun,r_fun,x_fun;
node(int l_,int r_){
l=l_,r=r_,mid=(l_+r_)>>1;
memset(val,0,sizeof(val));
l_s=r_s=nullptr;
}
inline void __update__(){for(ull i=0,*l_val=l_s->val,*r_val=r_s->val;i<31;i++)val[i]=l_val[i]+r_val[i];}
inline void __pd__(){
if(tag){
for(ull *i=l_s->val,*e=i+31,p=tag,tot=mid-l;i!=e;i++,p>>=1)if(p&1ull)*i=tot-*i;
for(ull *i=r_s->val,*e=i+31,p=tag,tot=r-mid;i!=e;i++,p>>=1)if(p&1ull)*i=tot-*i;
l_s->tag^=tag,r_s->tag^=tag,tag=0ull;
}
}
void init(){
if(l+1==r){
cin>>x_fun;
for(ull*i=val;x_fun;x_fun>>=1,i++) *i=x_fun&1ull,cout<<(x_fun&1ull);
return;
}
(l_s=new node(l,mid))->init(),(r_s=new node(mid,r))->init();
__update__();
}
void __query__(){
if(l_fun<=l&&r_fun>=r){
for(ull *i=val,*e=val+31,p=1;i!=e;i++,p<<=1) if(*i)x_fun+=((*i)*p);
return ;
}
__pd__();
if(l_fun<mid) l_s->__query__();
if(r_fun>mid) r_s->__query__();
}
void __modify__(){
if(l_fun<=l&&r_fun>=r){
for(ull *i=val,*e=val+31,p=x_fun,tot=r-l;p;i++,p>>=1)if(p&1ull)*i=tot-*i;
tag^=x_fun;
return ;
}
__pd__();
if(l_fun<mid) l_s->__modify__();
if(r_fun>mid) r_s->__modify__();
__update__();
}
inline ull query(ll l,ll r){return l_fun=l,r_fun=r,x_fun=0,__query__(),x_fun;}
inline void modify(ll l,ll r,ull x){return l_fun=l,r_fun=r,x_fun=x,__modify__();}
};
ull node::l_fun,node::r_fun,node::x_fun;
node*root;
int main(){
cin>>n;
(root=new node(1,n+1))->init();
cin>>m;
while(m--){
cin>>opt>>a>>b;
if(opt==2){
cin>>x;
root->modify(a,b+1,x);
}else{
cout<<root->query(a,b+1)<<'\n';
}
}
return 0;
}
样例:
5
4 10 3 13 7
8
1 2 4
2 1 3 3
1 2 4
1 3 3
2 2 5 5
1 1 5
2 1 2 10
1 2 3
cf输出:
1665512566
1665512564
1127969377
3383908163
1127969386