#include <cstdio>
#include<algorithm>
using namespace std;
int n,p,type,start,finish;
struct rec{int left,right,best;}arb[400010];
void egal(int node,int x)
{
arb[node].left=x;
arb[node].right=x;
arb[node].best=x;
}
void update(int node,int left,int right,int val)
{
if(start<=left&&right<=finish)
{
if(val==1)
egal(node,right-left+1);
else
egal(node,0);
return ;
}
int mid=(left+right)/2;
if(arb[node].best==0)
{
egal(2*node,0);
egal(2*node+1,0);
}
if(arb[node].best==right-left+1)
{
egal(2*node,mid-left+1);
egal(2*node+1,right-mid);
}
if(start<=mid)
update(2*node,left,mid,val);
if(mid<finish)
update(2*node+1,mid+1,right,val);
arb[node].best=max(arb[2*node].right+arb[2*node+1].left,max(arb[2*node].best,arb[2*node+1].best));
if(arb[2*node].left==mid-left+1)
arb[node].left=arb[node*2].left+arb[2*node+1].left;
else arb[node].left=arb[2*node].left;
if(arb[2*node+1].right==right-mid)
arb[node].right=arb[2*node].right+arb[2*node+1].right;
else arb[node].right=arb[2*node+1].right;
}
int main()
{
freopen("hotel.in","r",stdin);
freopen("hotel.out","w",stdout);
scanf("%d%d",&n,&p);
for(int i=1;i<=n;i++)
{
start=finish=i;
update(1,1,n,1);
}
for(;p;p--)
{
scanf("%d",&type);
start=finish=0;
if(type==1)
{
scanf("%d%d",&start,&finish);
finish+=start-1;
update(1,1,n,0);
}
else if(type==2)
{
scanf("%d%d",&start,&finish);
finish+=start-1;
update(1,1,n,1);
}
if(type==3)
printf("%d\n",arb[1].best);
}
return 0;
}