#include<stdio.h>
#define Ni 262144
#define abs(a) ((a)<0?-(a):(a))
#define max(a,b) ((a)>(b)?(a):(b))
int Max[Ni],Maxl[Ni],Maxr[Ni],Up[Ni],Down[Ni];
void setintervals(int n, int l, int r)
{
Max[n]=Maxl[n]=Maxr[n]=r-l+1;
if(l<r)
{
int m=(l+r)>>1;
setintervals(n<<1,l,m);
setintervals(n<<1|1,m+1,r);
}
}
void update(int n, int l, int r, int a, int b, int i, int up)
{
if(a<=l && r<=b)
{
Up[n]=i;
if(i>0)
Max[n]=Maxl[n]=Maxr[n]=0;
else
Max[n]=Maxl[n]=Maxr[n]=r-l+1;
}
else
{
int m=(l+r)>>1,mup;
mup=abs(up)>abs(Up[n<<1])?up:Up[n<<1];
if(a<=m)
update(n<<1,l,m,a,b,i,mup);
else
if(abs(mup)>Down[n<<1])
if(mup>0)
Max[n<<1]=Maxl[n<<1]=Maxr[n<<1]=0;
else
Max[n<<1]=Maxl[n<<1]=Maxr[n<<1]=m-l+1;
mup=abs(up)>abs(Up[n<<1|1])?up:Up[n<<1|1];
if(b>m)
update(n<<1|1,m+1,r,a,b,i,mup);
else
if(abs(mup)>Down[n<<1|1])
if(mup>0)
Max[n<<1|1]=Maxl[n<<1|1]=Maxr[n<<1|1]=0;
else
Max[n<<1|1]=Maxl[n<<1|1]=Maxr[n<<1|1]=r-m;
Down[n]=abs(i);
if(Max[n<<1]>Max[n<<1|1])
Max[n]=Max[n<<1];
else
Max[n]=Max[n<<1|1];
Max[n]=max(Max[n],Maxr[n<<1]+Maxl[n<<1|1]);
Maxl[n]=Maxl[n<<1];
if(Maxl[n]==m-l+1)
Maxl[n]+=Maxl[n<<1|1];
Maxr[n]=Maxr[n<<1|1];
if(Maxr[n]==r-m)
Maxr[n]+=Maxr[n<<1];
}
}
int main()
{
int n,m,i,t,a,b;
freopen("hotel.in","r",stdin);
freopen("hotel.out","w",stdout);
scanf("%d%d",&n,&m);
setintervals(1,1,n);
for(i=1;i<=m;++i)
{
scanf("%d",&t);
if(t<3)
{
scanf("%d%d",&a,&b);
update(1,1,n,a,a+b-1,(t==1?i:-i),Up[1]);
}
else
printf("%d\n",Max[1]);
}
return 0;
}