对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); } }