RT 代码如下
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int maxn=100005;
int n,m,t[maxn*4],lazy[maxn*4];
void Pushup(int k){
t[k]=t[k<<1]+t[k<<1|1];
}
void Pushdown(int l,int r,int k){
if(lazy[k]==0)return;
lazy[k<<1]^=1;
lazy[k<<1|1]^=1;
int m=(l+r)>>1;
t[k<<1]=(m-l+1)-t[k<<1];
t[k<<1|1]=(r-m)-t[k<<1|1];
lazy[k]=0;
return;
}
void updata(int L,int R,int l,int r,int k){
if(L<=l&&r<=R){
t[k]=(r-l+1)-t[k];
lazy[k]^=1;
return;
}else{
Pushdown(l,r,k);
int m=(l+r)>>1;
if(L<=m){
updata(L,R,l,m,k<<1);
}
if(R>m){
updata(L,R,m+1,r,k<<1|1);
}
Pushup(k);
}
}
int query(int L,int R,int l,int r,int k){
if(L<=l&&r<=R){
return t[k];
}else{
Pushdown(l,r,k);
int a,b;
int m=(l+r)>>1;
if(L<=m){
a=query(L,R,l,m,k<<1);
}
if(R>m){
b=query(L,R,m+1,r,k<<1|1);
}
return a+b;
}
}
signed main(){
scanf("%lld%lld",&n,&m);
for(int i=1;i<=m;i++){
int opt,x,y;
scanf("%lld",&opt);
if(opt==0){
cin>>x>>y;
updata(x,y,1,n,1);
}else{
scanf("%lld%lld",&x,&y);
printf("%lld\n",query(x,y,1,n,1));
}
}
return 0;
}