#include <fstream>
using namespace std;
ifstream fin ("hotel.in");
ofstream fout("hotel.out");
int n,V[100001],m,t,x,y,i;
struct nod
{
int x,s,d,l,ok;
}A[400001];
void build(int nod,int st,int dr)
{
if(st==dr)
{
A[nod].x=V[st];
A[nod].ok=0;
A[nod].s=A[nod].d=A[nod].l=1;
}
else
if(st<dr)
{
int mid=(st+dr)/2;
build(2*nod,st,mid);
build(2*nod+1,mid+1,dr);
A[nod].x=min(A[2*nod].x,A[2*nod+1].x);
A[nod].ok=0;
A[nod].s=A[nod].d=A[nod].l=dr-st+1;
}
}
void update(int nod,int st,int dr,int a,int b,int x)
{
if(a<=st&&dr<=b)
{
A[nod].x=x;
A[nod].ok=x;
if(x==0)
A[nod].s=A[nod].d=A[nod].l=dr-st+1;
else
A[nod].s=A[nod].d=A[nod].l=0;
}
else
{
int mid=(st+dr)/2;
if(A[nod].ok)
{
A[2*nod].ok=A[2*nod+1].ok=A[nod].ok;
A[2*nod].x=A[nod].x;
A[2*nod+1].x=A[nod].x;
if(A[nod].ok==1)
{
A[2*nod].s=A[2*nod].d=A[2*nod].l=0;
A[2*nod+1].s=A[2*nod+1].d=A[2*nod+1].l=0;
}
else
{
A[2*nod].s=A[2*nod].d=A[2*nod].l=mid-st+1;
A[2*nod+1].s=A[2*nod+1].d=A[2*nod+1].l=dr-mid;
}
A[nod].ok=0;
}
if(a<=mid)
update(2*nod,st,mid,a,b,x);
if(b>=mid+1)
update(2*nod+1,mid+1,dr,a,b,x);
A[nod].x=min(A[2*nod].x,A[2*nod+1].x);
A[nod].l=max(A[2*nod].d+A[2*nod+1].s,max(A[2*nod].l,A[2*nod+1].l));
A[nod].s=A[2*nod].s;
if(A[2*nod].s==mid-st+1)
A[nod].s+=A[2*nod+1].s;
A[nod].d=A[2*nod+1].d;
if(A[2*nod+1].d==dr-mid)
A[nod].d+=A[2*nod].d;
}
}
int main()
{
fin>>n>>m;
build(1,1,n);
for(i=1;i<=m;i++)
{
fin>>t;
if(t==1)
{
fin>>x>>y;
update(1,1,n,x,x+y-1,1);
}
else
if(t==2)
{
fin>>x>>y;
update(1,1,n,x,x+y-1,0);
}
else
fout<<A[1].l<<"\n";
}
return 0;
}