#include<bits/stdc++.h>
using namespace std;
#define g 800000+7
#define ll long long
ll n,m;
struct segmentTree
{
struct Node{
ll l,r,num,lz;
} tr[g*4];
void Build(ll pos,ll l,ll r)
{
tr[pos].l=l;
tr[pos].r=r;
tr[pos].lz=0;
tr[pos].num=0;
if(l==r) return;
ll mid=l+r>>1;
Build(pos<<1,l,mid);
Build(pos<<1|1,mid+1,r);
}
void Push_Down(ll pos)
{
ll temp=tr[pos].lz;
tr[pos].lz=0;
if(temp!=0)
{
tr[pos<<1].lz+=temp;
Switch(pos<<1);
tr[pos<<1|1].lz+=temp;
Switch(pos<<1|1);
}
}
void Switch(ll pos)
{
if(tr[pos].lz%2)
tr[pos].num=tr[pos].r-tr[pos].l+1-tr[pos].num;
if(tr[pos].l==tr[pos].r) tr[pos].lz=0;
return;
}
void Modify(ll pos,ll dl,ll dr)
{
if(tr[pos].l>=dl&&tr[pos].r<=dr)
{
tr[pos].lz++;
Switch(pos);
return;
}
Push_Down(pos);
ll mid=tr[pos].l+tr[pos].r>>1;
if(mid>=dl) Modify(pos<<1,dl,dr);
if(mid+1<=dr) Modify(pos<<1|1,dl,dr);
tr[pos].num=tr[pos<<1].num+tr[pos<<1|1].num;
}
ll Query(ll pos,ll dl,ll dr)
{
if(tr[pos].l>=dl&&tr[pos].r<=dr)
return tr[pos].num;
Push_Down(pos);
ll mid=tr[pos].l+tr[pos].r>>1;
ll ans=0;
if(mid>=dl) ans+=Query(pos<<1,dl,dr);
if(mid+1<=dr) ans+=Query(pos<<1|1,dl,dr);
return ans;
}
} ST;
int main(void)
{
cin>>n>>m;
ST.Build(1,1,n);
for(int i=0;i<m;i++)
{
int c,x,y;
cin>>c;
if(c==0)
{
cin>>x>>y;
ST.Modify(1,x,y);
}
else
{
cin>>x>>y;
cout<<ST.Query(1,x,y)<<endl;
}
}
return 0;
}