#include <bits/stdc++.h>
using namespace std;
ifstream f("hotel.in");
ofstream g("hotel.out");
int n,q,t,x,y;
const int N=1e5+3;
struct pct
{
int mxl,mxr;
int mx;
}a[4*N];
void build(int nod,int st,int dr)
{
if(st==dr)
a[nod]={1,1,1};
else
{
int mij=(st+dr)/2;
a[nod]={dr-st+1,dr-st+1,dr-st+1};
build(nod*2,st,mij);
build(nod*2+1,mij+1,dr);
}
}
void add(int nod,int st,int dr,int qst,int qdr)
{
if(a[nod].mx==dr-st+1)
{
int mj=(st+dr)/2;
a[nod*2+1]={dr-mj,dr-mj,dr-mj};
a[nod*2]={mj-st+1,mj-st+1,mj-st+1};
}
if(qst<=st&&dr<=qdr)
{
// g<<qst<<" "<<qdr<<" "<<st<<" "<<dr<<'\n';
a[nod]={0,0,0};
}
else
{
int mj=(st+dr)/2;
if(mj>=qst)
add(nod*2,st,mj,qst,qdr);
if(mj<qdr)
add(nod*2+1,mj+1,dr,qst,qdr);
pct l=a[nod*2];
pct r=a[nod*2+1];
a[nod].mx=max(max(l.mx,r.mx),l.mxr+r.mxl);
if(l.mxl==mj-st+1)
a[nod].mxl=l.mxl+r.mxl;
else
a[nod].mxl=l.mxl;
if(r.mxr==dr-mj)
a[nod].mxr=r.mxr+l.mxr;
else
a[nod].mxr=r.mxr;
}
}
void leaf(int nod,int st,int dr,int qst,int qdr)
{
if(a[nod].mx==0)
{
a[nod*2+1]=a[nod*2]={0,0,0};
}
if(qst<=st&&dr<=qdr)
{
a[nod]={dr-st+1,dr-st+1,dr-st+1};
}
else
{
int mj=(st+dr)/2;
if(mj>=qst)
leaf(nod*2,st,mj,qst,qdr);
if(mj<qdr)
leaf(nod*2+1,mj+1,dr,qst,qdr);
pct l=a[nod*2];
pct r=a[nod*2+1];
a[nod].mx=max(max(l.mx,r.mx),l.mxr+r.mxl);
if(l.mxl==mj-st+1)
a[nod].mxl=l.mxl+r.mxl;
else
a[nod].mxl=l.mxl;
if(r.mxr==dr-mj)
a[nod].mxr=r.mxr+l.mxr;
else
a[nod].mxr=r.mxr;
}
}
int main()
{
f>>n>>q;
build(1,1,n);
while(q--)
{
f>>t;
if(t==1)
{
f>>x>>y;
add(1,1,n,x,x+y-1);
}
else
if(t==2)
{
f>>x>>y;
leaf(1,1,n,x,x+y-1);
}
else
{
g<<a[1].mx<<'\n';
}
}
return 0;
}