/*
这道题数据比较强啊
每次更新答案=当前区间总数-当前答案。
标记取反。
*/
#include<iostream>
#include<cstdio>
#include<cstring>
#define maxn 100005
using namespace std;
int n,m,x,y,z;
struct node
{
int l,r,sum,dis,flag;
}tre[maxn<<2];
inline int init()
{
int x=0,f=1;char c=getchar();
while(c>'9'||c<'0'){if(c=='-')f=-1;c=getchar();}
while(c>='0'&&c<='9'){x=x*10+c-'0';c=getchar();}
return x*f;
}
void build(int now,int l,int r)
{
tre[now].l=l;tre[now].r=r;tre[now].sum=r-l+1;
if(l==r) return;
int mid=(l+r)>>1;
build(now<<1,l,mid);build(now<<1|1,mid+1,r);
}
void down(int now)
{
tre[now<<1].flag^=1;
tre[now<<1|1].flag^=1;
tre[now<<1].dis=tre[now<<1].sum-tre[now<<1].dis;
tre[now<<1|1].dis=tre[now<<1|1].sum-tre[now<<1|1].dis;
tre[now].flag=0;
}
void change(int now,int l,int r)
{
if(tre[now].l==l&&tre[now].r==r)
{
tre[now].flag^=1;
tre[now].dis=tre[now].sum-tre[now].dis;
return;
}
if(tre[now].flag) down(now);
int mid=(tre[now].l+tre[now].r)>>1;
if(l>mid) change(now<<1|1,l,r);
else if(r<=mid) change(now<<1,l,r);
else
{
change(now<<1,l,mid);
change(now<<1|1,mid+1,r);
}
tre[now].dis=tre[now<<1].dis+tre[now<<1|1].dis;
}
int query(int now,int l,int r)
{
if(tre[now].l==l&&tre[now].r==r) return tre[now].dis;
if(tre[now].flag) down(now);
int mid=(tre[now].l+tre[now].r)>>1;
if(l>mid) return query(now<<1|1,l,r);
else if(r<=mid) return query(now<<1,l,r);
else return query(now<<1,l,mid)+query(now<<1|1,mid+1,r);
}
int main()
{
n=init();m=init();
build(1,1,n);
for(int i=1;i<=m;i++)
{
x=init();y=init();z=init();
if(!x) change(1,y,z);
else printf("%d
",query(1,y,z));
}
return 0;
}