#include<cstdio>
#define max(a,b) a>b?a:b
void build(int,int,int),update(int,int,int),goleste(int,int,int);
int n,m,t,CURR[300010],ST[300010],DR[300010],st,x,fn;
int main()
{
freopen("hotel.in","r",stdin);
freopen("hotel.out","w",stdout);
scanf("%d%d",&n,&m);
build(1,n,1);
for(;m;--m)
{
scanf("%d",&t);
if(t==3)printf("%d\n",CURR[1]);
if(t==1)
{
scanf("%d%d",&st,&x);
fn=st+x-1;
update(1,n,1);
}
if(t==2)
{
scanf("%d%d",&st,&x);
fn=st+x-1;
goleste(1,n,1);
}
}
}
void build(int X,int Y,int cnt)
{
CURR[cnt]=Y-X+1;
ST[cnt]=Y-X+1; //incepe in X
DR[cnt]=Y-X+1; // se termina in Y
if(Y==X)return;
int mij=(Y+X)/2;
build(X,mij,cnt+cnt);
build(mij+1,Y,cnt+cnt+1);
}
void update(int X,int Y,int cnt)
{
if(st<=X&&Y<=fn)
{
CURR[cnt]=0;
ST[cnt]=0;
DR[cnt]=0;
if(X==Y)return;
int mij=(X+Y)/2;
update(X,mij,cnt+cnt);
update(mij+1,Y,cnt+cnt+1);
}
else
{
int mij=(X+Y)/2;
if(st<=mij)update(X,mij,cnt+cnt);
if(fn>=mij+1)update(mij+1,Y,cnt+cnt+1);
CURR[cnt]=max(CURR[cnt+cnt],CURR[cnt+cnt+1]);
CURR[cnt]=max(CURR[cnt],ST[cnt+cnt+1]+DR[cnt+cnt]);
if(ST[cnt+cnt]==mij-X+1)ST[cnt]=ST[cnt+cnt]+ST[cnt+cnt+1]; else ST[cnt]=ST[cnt+cnt];
if(DR[cnt+cnt+1]==Y-mij)DR[cnt]=DR[cnt+cnt]+DR[cnt+cnt+1]; else DR[cnt]=DR[cnt+cnt+1];
}
}
void goleste(int X,int Y,int cnt)
{
if(st<=X&&Y<=fn)
{
CURR[cnt]=Y-X+1;
ST[cnt]=Y-X+1;
DR[cnt]=Y-X+1;
if(X==Y)return;
int mij=(X+Y)/2;
goleste(X,mij,cnt+cnt);
goleste(mij+1,Y,cnt+cnt+1);
}
else
{
int mij=(X+Y)/2;
if(st<=mij)goleste(X,mij,cnt+cnt);
if(fn>=mij+1)goleste(mij+1,Y,cnt+cnt+1);
CURR[cnt]=max(CURR[cnt+cnt],CURR[cnt+cnt+1]);
CURR[cnt]=max(CURR[cnt],ST[cnt+cnt+1]+DR[cnt+cnt]);
if(ST[cnt+cnt]==mij-X+1)ST[cnt]=ST[cnt+cnt]+ST[cnt+cnt+1]; else ST[cnt]=ST[cnt+cnt];
if(DR[cnt+cnt+1]==Y-mij)DR[cnt]=DR[cnt+cnt]+DR[cnt+cnt+1]; else DR[cnt]=DR[cnt+cnt+1];
}
}