#include <algorithm>
using namespace std;
#define DIM 100005
struct arb {int st,dr,cur;} aint[3*DIM];
int n,p;
void init (int nod,int st,int dr)
{
int mij;
aint[nod].cur=aint[nod].st=aint[nod].dr=dr-st+1;
if (st<dr)
{
mij=(st+dr)/2;
init (2*nod,st,mij);
init (2*nod+1,mij+1,dr);
}
}
void update (int nod,int st,int dr,int in,int sf,int tip)
{
int mij,val;
if (in<=st && dr<=sf)
{
if (tip==1)
aint[nod].st=aint[nod].dr=aint[nod].cur=0;
else if (tip==2)
aint[nod].st=aint[nod].dr=aint[nod].cur=dr-st+1;
return ;
}
mij=(st+dr)/2;
if (aint[nod].cur==0)
{
aint[2*nod].st=aint[2*nod].dr=aint[2*nod].cur=0;
aint[2*nod+1].st=aint[2*nod+1].dr=aint[2*nod+1].cur=0;
}
if (aint[nod].cur==dr-st+1)
{
aint[2*nod].st=aint[2*nod].dr=aint[2*nod].cur=mij-st+1;
aint[2*nod+1].st=aint[2*nod+1].dr=aint[2*nod+1].cur=dr-mij;
}
if (in<=mij)
update (2*nod,st,mij,in,sf,tip);
if (mij<sf)
update (2*nod+1,mij+1,dr,in,sf,tip);
val=aint[2*nod].st;
if(val==mij-st+1)
val+=aint[2*nod+1].st;
aint[nod].st=val;
val=aint[2*nod+1].dr;
if(val==dr-mij)
val+=aint[2*nod].dr;
aint[nod].dr=val;
val=aint[2*nod].dr+aint[2*nod+1].st;
val=max (val,aint[2*nod].cur);
val=max (val,aint[2*nod+1].cur);
aint[nod].cur=val;
aint[nod].cur=max (aint[nod].cur,aint[nod].st);
aint[nod].cur=max (aint[nod].cur,aint[nod].dr);
}
void solve ()
{
int i,tip,x,y;
scanf ("%d",&p);
init (1,1,n);
for (i=1; i<=p; ++i)
{
scanf ("%d",&tip);
if (tip==1)
{
scanf ("%d%d",&x,&y);
update (1,1,n,x,x+y-1,1);
}
else if (tip==2)
{
scanf ("%d%d",&x,&y);
update (1,1,n,x,x+y-1,2);
}
else
printf ("%d\n",aint[1].cur);
}
}
int main ()
{
freopen ("hotel.in","r",stdin);
freopen ("hotel.out","w",stdout);
scanf ("%d",&n);
solve ();
return 0;
}