#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<iostream>
using namespace std;
inline int Read_(){
int x=0,f=1;char ch=getchar();
while(ch<‘0‘||ch>‘9‘){if(ch==‘-‘)f=-1;ch=getchar();}
while(ch>=‘0‘&&ch<=‘9‘){x=x*10+ch-‘0‘;ch=getchar();}
return x*f;
}
int n,m,ans;
struct node{
int l,r,s;
bool c;
}e[400000];
void build(int l,int r,int num){
e[num].l=l;e[num].r=r;e[num].s=0;e[num].c=0;
if(l==r) return;
int mid=(l+r)>>1;
build(l,mid,num<<1);
build(mid+1,r,num<<1|1);
return;
}
void down_(int num){
e[num].c=0;
e[num<<1].c=1-e[num<<1].c;
e[num<<1].s=e[num<<1].r-e[num<<1].l+1-e[num<<1].s;
e[num<<1|1].c=1-e[num<<1|1].c;
e[num<<1|1].s=e[num<<1|1].r-e[num<<1|1].l+1-e[num<<1|1].s;
return;
}
void update_(int l,int r,int num){
if(e[num].l==l&&e[num].r==r){
e[num].c=1-e[num].c;
e[num].s=e[num].r-e[num].l+1-e[num].s;
return;
}
if(e[num].c) down_(num);
if(e[num<<1].r>=r) update_(l,r,num<<1);
else if(e[num<<1].r<l) update_(l,r,num<<1|1);
else{
update_(l,e[num<<1].r,num<<1);
update_(e[num<<1|1].l,r,num<<1|1);
}
e[num].s=e[num<<1].s+e[num<<1|1].s;
return;
}
void solve_(int l,int r,int num){
if(e[num].l==l&&e[num].r==r){
ans+=e[num].s;
return;
}
if(e[num].c)down_(num);
if(e[num<<1].r>=r) solve_(l,r,num<<1);
else if(e[num<<1].r<l) solve_(l,r,num<<1|1);
else{
solve_(l,e[num<<1].r,num<<1);
solve_(e[num<<1|1].l,r,num<<1|1);
}
return;
}
int main(){
int ty,L,R;
n=Read_();m=Read_();
build(1,n,1);
for(int i=1;i<=m;i++){
ty=Read_();L=Read_();R=Read_();
if(!ty) update_(L,R,1);
else {
ans=0;
solve_(L,R,1);
printf("%d\n",ans);
}
}
return 0;
}