#include <cstdio>
#include <algorithm>
using namespace std;
int a,b,n;
int arb[400005];
int dr[400005];
int st[400005];
void update1(int nod,int left,int right,int p)
{
if(left>=a && b>=right)
{
//printf("left : %d right : %d \n",left,right);
if(p==1) p=right-left+1;
arb[nod]=p;
st[nod]=p;
dr[nod]=p;
return;
}
int mij=(left+right)/2;
//cum ?
if(arb[nod]==0)
{
arb[2*nod]=0;
arb[2*nod+1]=0;
st[2*nod]=0;
st[2*nod+1]=0;
dr[2*nod]=0;
dr[2*nod+1]=0;
}
if(arb[nod]==right-left+1)
{
arb[2*nod]=dr[2*nod]=st[2*nod]=mij-left+1;
arb[2*nod+1]=dr[2*nod+1]=st[2*nod+1]=right-mij;
}
if(a<=mij) update1(2*nod,left,mij,p);
if(b>mij) update1(2*nod+1,mij+1,right,p);
arb[nod]=max( arb[2*nod] , max ( arb[2*nod+1] , dr[2*nod]+st[2*nod+1] ) );
st[nod]= (st[2*nod]< (mij-left+1))?st[2*nod]:(st[2*nod]+st[2*nod+1]);
dr[nod]= (dr[2*nod+1]< (right-mij))?dr[2*nod+1]:(dr[2*nod]+dr[2*nod+1]);
return;
}
void update(int nod,int left,int right,int poz)
{
if(left==right)
{
arb[nod]=1;
st[nod]=1;
dr[nod]=1;
return;
}
int mij=(left+right)/2;
if(poz<=mij) update(2*nod,left,mij,poz);
else update(2*nod+1,mij+1,right,poz);
arb[nod]=arb[2*nod]+arb[2*nod+1];
st[nod]=arb[nod];
dr[nod]=arb[nod];
return;
}
int main()
{
int m;
freopen("hotel.in","r", stdin);
freopen("hotel.out","w", stdout);
scanf("%d %d",&n,&m);
for(int i=1;i<=n;i++)
update(1,1,n,i);
for(int i=1;i<=m;i++)
{
int tip;
scanf("%d",&tip);
if(tip==1 || tip==2)
{
scanf("%d %d",&a,&b);
b=a+b-1;
if(tip==1)
update1(1,1,n,0);
else
update1(1,1,n,1);
// printf("t: %d\n",arb[1]);
}
else
{
printf("%d\n",arb[1]);
}
}
return 0;
}