#include<fstream>
#define INF 1000000000000000000
using namespace std;
ifstream f("hotel.in");
ofstream g("hotel.out");
int n,lazy[400002];
struct elem
{
int maxim,st,dr;
};
elem aint[400002];
void propagate(int nod,int st,int dr)
{
if(lazy[nod]==-1)
aint[nod].maxim=dr-st+1,aint[nod].st=dr-st+1,aint[nod].dr=dr-st+1;
else
if(lazy[nod]==1)
aint[nod].maxim=0,aint[nod].st=0,aint[nod].dr=0;
if(st!=dr)
{
lazy[2*nod]+=lazy[nod];
lazy[2*nod+1]+=lazy[nod];
}
lazy[nod]=0;
}
elem join(int x,int st1,int dr1,int y,int st2,int dr2)
{
elem z;
z.maxim=max(aint[x].maxim,aint[y].maxim);
z.maxim=max(z.maxim,aint[x].dr+aint[y].st);
z.st=aint[x].st;
if(aint[x].st==dr1-st1+1)
z.st+=aint[y].st;
z.dr=aint[y].dr;
if(aint[y].dr==dr2-st2+1)
z.dr+=aint[x].dr;
return z;
}
void lazy_update(int nod,int st,int dr,int left,int right,int value)
{
if(st==left&&dr==right)
{
lazy[nod]+=value;
propagate(nod,st,dr);
}
else
{
int mij=(st+dr)/2;
propagate(nod,st,dr);
propagate(2*nod,st,mij);
propagate(2*nod+1,mij+1,dr);
if(right<=mij)
lazy_update(2*nod,st,mij,left,right,value);
else
if(mij<left)
lazy_update(2*nod+1,mij+1,dr,left,right,value);
else
{
lazy_update(2*nod,st,mij,left,mij,value);
lazy_update(2*nod+1,mij+1,dr,mij+1,right,value);
}
aint[nod]=join(2*nod,st,mij,2*nod+1,mij+1,dr);
}
}
void lazy_update(int a,int b,int value)
{
lazy_update(1,1,n,a,b,value);
}
void init(int nod,int st,int dr)
{
aint[nod]={dr-st+1,dr-st+1,dr-st+1};
if(st!=dr)
{
int mij=(st+dr)/2;
init(2*nod,st,mij);
init(2*nod+1,mij+1,dr);
}
}
void init()
{
init(1,1,n);
}
int main()
{
int i,c,x,y,m;
f>>n>>m;
init();
for(i=1;i<=m;i++)
{
f>>c;
if(c==1)
{
f>>x>>y;
lazy_update(x,x+y-1,1);
}
else
if(c==2)
{
f>>x>>y;
lazy_update(x,x+y-1,-1);
}
else
g<<aint[1].maxim<<'\n';
}
return 0;
}