RT 关了O2就过了
#include<bits/stdc++.h>
using namespace std;
const int N=4e5+10;
int n,m,t[N],lazy[N];
int pushup(int k){
t[k]=t[k<<1]+t[k<<1|1];
}
void build(int k,int l,int r){
if(l==r){
t[k]=0;
return ;
}
int mid=l+r>>1;
build(k<<1,l,mid);
build(k<<1|1,mid+1,r);
pushup(k);
}
void change(int k,int l,int r){
lazy[k]^=1;
t[k]=(r-l+1)-t[k];
}
void pushdown(int k,int l,int r){
if(lazy[k]){
int mid=l+r>>1;
change(k<<1,l,mid);
change(k<<1|1,mid+1,r);
lazy[k]=0;
}
}
void update(int k,int l,int r,int x,int y){
if(x<=l&&r<=y){
change(k,l,r);
return;
}
pushdown(k,l,r);
int mid=l+r>>1;
if(x<=mid)update(k<<1,l,mid,x,y);
if(y>mid)update(k<<1|1,mid+1,r,x,y);
pushup(k);
}
int query(int k,int l,int r,int x,int y){
if(x<=l&&r<=y){
return t[k];
}
pushdown(k,l,r);
int mid=l+r>>1;
int res=0;
if(x<=mid)res+=query(k<<1,l,mid,x,y);
if(y>mid)res+=query(k<<1|1,mid+1,r,x,y);
return res;
}
int main(){
scanf("%d%d",&n,&m);
int c,a,b;
build(1,1,n);
for(int i=1;i<=m;i++){
scanf("%d%d%d",&c,&a,&b);
if(c==0)update(1,1,n,a,b);
else if(c==1)printf("%d\n",query(1,1,n,a,b));
}
return 0;
}