#include <cstdio>
#define LMAX 400023
struct str
{
int st;
int dr;
int best;
}arb[LMAX];
int n,m;
int maxim(int a,int b,int c)
{
if(a>b)
{
if(a>c) return a;
return c;
}
if(b>c) return b;
return c;
}
void update(int s,int e,int p1,int p2,int nod,int caz)
{
if(s==p1&&e==p2)
{
if(caz==0)
{
arb[nod].st=0;
arb[nod].dr=0;
arb[nod].best=0;
}
else if(caz==1)
{
arb[nod].st=p2-p1+1;
arb[nod].dr=p2-p1+1;
arb[nod].best=p2-p1+1;
}
return;
}
else
{
int mij=(s+e)/2;
if(arb[nod].best==0)
{
arb[2*nod].best=0;arb[2*nod].st=0;arb[2*nod].dr=0;
arb[2*nod+1].best=0;arb[2*nod+1].st=0;arb[2*nod+1].dr=0;
}
if(arb[nod].best==e-s+1)
{
arb[2*nod].best=mij-s+1;arb[2*nod].st=mij-s+1;arb[2*nod].dr=mij-s+1;
arb[2*nod+1].best=e-mij;arb[2*nod+1].st=e-mij;arb[2*nod+1].dr=e-mij;
}
if(p2<=mij) update(s,mij,p1,p2,2*nod,caz);
else if(p1>mij) update(mij+1,e,p1,p2,2*nod+1,caz);
else
{
update(s,mij,p1,mij,2*nod,caz);
update(mij+1,e,mij+1,p2,2*nod+1,caz);
}
if(arb[2*nod].st==mij-s+1) arb[nod].st=arb[2*nod].st+arb[2*nod+1].st;
else arb[nod].st=arb[2*nod].st;
if(arb[2*nod+1].dr==e-(mij+1)+1) arb[nod].dr=arb[2*nod].dr+arb[2*nod+1].dr;
else arb[nod].dr=arb[2*nod+1].dr;
arb[nod].best=maxim(arb[2*nod].best,arb[2*nod+1].best,arb[2*nod].dr+arb[2*nod+1].st);
}
}
int main()
{
freopen ("hotel.in","r",stdin);
freopen ("hotel.out","w",stdout);
scanf("%d%d",&n,&m);
int caz,x,y;
for(int i=1;i<=n;i++) update(1,n,i,i,1,1);
for(int i=1;i<=m;i++)
{
scanf("%d",&caz);
if(caz==1)
{
scanf("%d%d",&x,&y);
update(1,n,x,x+y-1,1,0);
}
else if(caz==2)
{
scanf("%d%d",&x,&y);
update(1,n,x,x+y-1,1,1);
}
else printf("%d\n",arb[1].best);
}
}