对01序列
区间异或,求区间和
#include <iostream>
#include<queue>
#include <cstring>
#define IOS std::ios::sync_with_stdio(0)
using namespace std;
#define rt1 rt<<1
#define rt2 rt<<1|1
const int N= 1e5;
int sum[N<<2],lz[N<<2],n;
void xg(int rt,int l,int r){
sum[rt]=r-l+1-sum[rt] ;
lz[rt] ^=1;
}
void down(int rt,int l,int r){
if(lz[rt]){
int md=(l+r)/2;
xg(rt1,l,md); xg(rt2,md+1,r);
lz[rt]=0;
}
}
void add(int rt,int l,int r,int x,int y){
if(x<=l&&y>=r) return xg(rt,l,r);
down(rt,l,r);
int md=(l+r)/2;
if(x<=md) add(rt1,l,md,x,y);
if(y>md) add(rt2,md+1,r,x,y);
sum[rt]=sum[rt1]+sum[rt2];
}
int qq(int rt,int l,int r,int x,int y){
if(x<=l&&y>=r) return sum[rt];
down(rt,l,r);
int md=(l+r)/2,t=0;
if(x<=md) t+=qq(rt1,l,md,x,y);
if(y>md) t+=qq(rt2,md+1,r,x,y);
return t;
}
void build(int rt,int l,int r){
if(l==r){
sum[rt]=0; return ;
}
int md=(l+r)/2;
build(rt1,l,md); build(rt2,md+1,r);
sum[rt]=sum[rt1]+sum[rt2];
}
signed main(){
IOS;
int i,x,y,op,tes;
cin>>n>>tes;
build(1,1,n);
while(tes--){
cin>>op>>x>>y;
if(op) cout<<qq(1,1,n,x,y)<<endl;
else add(1,1,n,x,y);
}
}
浙公网安备 33010602011771号