#include<bits/stdc++.h>
#define MAXN 100005
using namespace std;
inline int read(){
int s=0,t=1;
char c=getchar();
while(c<'0'||c>'9'){
if(c=='-') t=-1;
c=getchar();
}
while(c>='0'&&c<='9'){
s=s*10+c-'0';c=getchar();
}
return s*t;
}
inline void write(int p){
if(p<10){
putchar(p+'0');return;
}
write(p/10);putchar(p%10+'0');
}
struct node{
int s;bool f;
}t[4*MAXN];
inline void build(int l,int r,int rt){
t[rt].s=0;t[rt].f=false;
if(l==r) return;
int mid=(l+r)>>1;
build(1,mid,rt<<1);build(mid+1,r,rt<<1|1);
}
inline void lazy(int l,int r,int rt){
if(t[rt].f){
int mid=(l+r)>>1;
t[rt<<1].f=!t[rt<<1].f;
t[rt<<1|1].f=!t[rt<<1|1].f;
t[rt<<1].s=mid-l+1-t[rt<<1].s;
t[rt<<1|1].s=r-mid-t[rt<<1|1].s;
t[rt].f=!t[rt].f;
}
}
inline void change(int l,int r,int rt,int left,int right){
if(l>=left&&r<=right){
t[rt].s=l-r+1-t[rt].s;t[rt].f=!t[rt].f;return;
}
lazy(l,r,rt);
int mid=(l+r)>>1;
if(left<=mid) change(l,mid,rt<<1,left,right);
if(right>mid) change(mid+1,r,rt<<1|1,left,right);
t[rt].s=t[rt<<1].s+t[rt<<1|1].s;
}
inline int query(int l,int r,int rt,int left,int right){
if(l>=left&&r<=right) return t[rt].s;
lazy(l,r,rt);
int ans=0,mid=(l+r)>>1;
if(left<=mid) ans+=query(l,mid,rt<<1,left,right);
if(right>mid) ans+=query(mid+1,r,rt<<1|1,left,right);
return ans;
}
int main(){
int n,m,c,a,b;
n=read();m=read();
build(1,n,1);
for(register int i=1;i<=m;++i){
c=read();a=read();b=read();
if(!c) change(1,n,1,a,b);
else{
write(query(1,n,1,a,b));putchar('\n');
}
}
return 0;
}