#include<iostream>
#include<cstring>
#define MAX_N 100010
using namespace std;
bool tree[MAX_N<<2|1];
long long sum[MAX_N<<2]={0};
long long ls(long long p){
return p<<1;
}
long long rs(long long p){
return p<<1|1;
}
void push_down(long long p,long long l,long long r,long long mid){
if(!tree[p])return;
sum[ls(p)]=mid-l+1-sum[ls(p)];
sum[rs(p)]=r-mid-sum[rs(p)];
if(!tree[ls(p)]){
tree[ls(p)]=true;
}
if(!tree[rs(p)]){
tree[rs(p)]=true;
}
tree[p]=false;
}
void push_up(long long p){
sum[p]=sum[ls(p)]+sum[rs(p)];
}
void update(long long p,long long l,long long r,long long x,long long y){
if(x<=l&&y>=r){
sum[p]=r-l+1-sum[p];
if(!tree[p]){
tree[p]=true;
}
return;
}
long long mid=(l+r)>>1;
push_down(p,l,r,mid);
if(x<=mid)update(ls(p),l,mid,x,y);
if(y>mid)update(rs(p),mid+1,r,x,y);
push_up(p);
}
long long query(long long p,long long l,long long r,long long x,long long y){
if(x<=l&&y>=r){
return sum[p];
}
long long ans=0;
long long mid=(l+r)>>1;
push_down(p,l,r,mid);
if(x<=mid)ans+=query(ls(p),l,mid,x,y);
if(y>mid)ans+=query(rs(p),mid+1,r,x,y);
return ans;
}
int main(){
long long n=0,m=0;
cin>>n>>m;
memset(tree,false,sizeof(tree));
for(long long i=1;i<=m;i++){
long long op=0;
cin>>op;
long long x=0,y=0;
if(op==0){
cin>>x>>y;
update(1,1,n,x,y);
}
else if(op==1){
cin>>x>>y;
cout<<query(1,1,n,x,y)<<endl;
}
}
return 0;
}