#include<iostream>
#include<cstdio>
#include<cmath>
using namespace std;
const int maxn=350;
int n,t,tot,op,L,R,start,end,num;
int a[maxn*maxn];
struct blo{
int l,r,sum,tag;
}block[350];
void update(int l,int r){
start=l/tot+l%tot?1:0;
end=r/tot+r%tot?1:0;
if(start==end){
for(int i=l;i<=r;i++){
if(a[i])
block[start].sum--;
else
block[start].sum++;
a[i]=!a[i];
}
return ;
}
if(l!=block[start].l){
for(int i=l;i<=block[start].r;i++){
if(a[i])
block[start].sum--;
else
block[start].sum++;
a[i]=!a[i];
}
start++;
}
if(r!=block[end].r){
for(int i=block[end].l;i<=r;i++){
if(a[i])
block[end].sum--;
else
block[end].sum++;
a[i]=!a[i];
}
end--;
}
for(int i=start;i<=end;i++){
block[i].sum=tot-block[i].sum;
block[i].tag=!block[i].tag;
}
return ;
}
int query(int l,int r){
num=0;
start=l/tot+l%tot?1:0;
end=r/tot+r%tot?1:0;
if(start==end){
if(block[start].tag){
for(int i=l;i<=r;i++){
if(!a[i])
num++;
}
return num;
}
else{
for(int i=l;i<=r;i++){
if(a[i])
num++;
}
return num;
}
}
if(l!=block[start].l){
if(block[start].tag)
for(int i=l;i<=block[start].r;i++)
if(!a[i])
num++;
else
for(int i=l;i<=block[start].r;i++)
if(a[i])
num++;
start++;
}
if(r!=block[end].r){
if(block[end].tag)
for(int i=block[end].l;i<=r;i++)
if(!a[i])
num++;
else
for(int i=block[end].l;i<=r;i++)
if(a[i])
num++;
end--;
}
for(int i=start;i<=end;i++)
num+=block[i].sum;
return num;
}
int main(){
scanf("%d%d",&n,&t);
tot=sqrt(n);
for(int i=1;i<=tot;i++){
block[i].l=i+tot*(i-1);
block[i].r=tot*i;
}
if(block[tot].r<n){
block[tot+1].l=block[tot].r+1;
block[tot+1].r=n;
}
while(t--){
scanf("%d%d%d",&op,&L,&R);
if(!op)
update(L,R);
else
printf("%d\n",query(L,R));
}
return 0;
}
莫名的都tle了,就对了两个点