#include<bits/stdc++.h>
#define lid (id*2)
#define rid (id*2+1)
#define int long long
using namespace std;
const int maxn=200005;
int n,op,q;
struct seg_tree{int l,r,sum,add;}tr[maxn*4];
void build(int id,int l,int r){
tr[id].l=l,tr[id].r=r,tr[id].sum=0;
if(l==r)return;
else{
int mid=(l+r)/2;
build(lid,l,mid);
build(rid,mid+1,r);
return;
}
}
void pushdown(int id){
if(tr[id].l!=tr[id].r&&tr[id].add){
tr[lid].sum=tr[lid].r-tr[lid].l+1-tr[lid].sum;
tr[rid].sum=tr[rid].r-tr[rid].l+1-tr[rid].sum;
tr[lid].add=tr[lid].add==1?0:1;
tr[rid].add=tr[rid].add==1?0:1;
}
return;
}
void change(int id,int l,int r){
pushdown(id);
if(tr[id].l==l&&tr[id].r==r){
tr[id].sum=tr[id].r-tr[id].l+1-tr[lid].sum,tr[lid].add=1;
return;
}
int mid=(tr[id].l+tr[id].r)/2;
if(r<=mid)change(lid,l,r);
else if(l>mid)change(rid,l,r);
else {
change(lid,l,mid);
change(rid,mid+1,r);
}
tr[id].sum=tr[lid].sum+tr[rid].sum;
}
int query(int id,int l,int r){
pushdown(id);
if(tr[id].l==l&&tr[id].r==r)return tr[id].sum;
int mid=(tr[id].l+tr[id].r)>>1;
if(r<=mid)return query(lid,l,r);
if(l>mid)return query(rid,l,r);
return query(lid,l,mid)+query(rid,mid+1,r);
}
signed main(){
cin>>n>>q;
build(1,1,n);
while(q--){
cin>>op;
if(op==0){
int x,y;
scanf("%lld%lld",&x,&y);
change(1,x,y);
}
if(op==1){
int x,y;
scanf("%lld%lld",&x,&y);
printf("%lld\n",query(1,x,y));
}
}
return 0;
}