#include <fstream>
using namespace std;
ifstream f("hotel.in");
ofstream g("hotel.out");
int n,m;
const int N=1e5+5;
struct pct
{
int val,left,right,lz;
} a[4*N];
void update_nod(int nod,int st,int dr)
{
int mj=(st+dr)/2;
if(a[nod*2].left==mj-st+1)
a[nod].left=a[nod*2].left+a[nod*2+1].left;
else
a[nod].left=a[nod*2].left;
if(a[nod*2+1].right==dr-mj)
a[nod].right=a[nod*2+1].right+a[nod*2].right;
else
a[nod].right=a[nod*2+1].right;
a[nod].val=max(a[nod].right,max(a[nod].left,a[nod*2].right+a[nod*2+1].left));
}
void prag(int nod,int st,int dr)
{
int mj=(st+dr)/2;
if(a[nod].lz==1)
{
a[nod].lz=0;
int s=nod*2;
a[s].val=a[s].left=a[s].right=mj-st+1;
a[s].lz=1;
s=nod*2+1;
a[s].val=a[s].left=a[s].right=dr-mj;
a[s].lz=1;
}
else if(a[nod].lz==-1)
{
a[nod].lz=0;
int s=nod*2;
a[s].val=a[s].left=a[s].right=0;
a[s].lz=-1;
s=nod*2+1;
a[s].val=a[s].left=a[s].right=0;
a[s].lz=-1;
}
}
void update(int nod,int st,int dr,int qst,int qdr,int tip)
{
if(qst<=st&&dr<=qdr)
{
if(tip==1)
{
a[nod].val=dr-st+1;
a[nod].left=dr-st+1;
a[nod].right=dr-st+1;
a[nod].lz=1;
}
else
{
a[nod].val=a[nod].left=a[nod].right=0;
a[nod].lz=-1;
}
return;
}
prag(nod,st,dr);
int mj=(st+dr)/2;
if(mj>=qst)
update(nod*2,st,mj,qst,qdr,tip);
if(mj<qdr)
update(nod*2+1,mj+1,dr,qst,qdr,tip);
update_nod(nod,st,dr);
}
void build(int nod,int st,int dr)
{
int mj=(st+dr)/2;
a[nod].val=a[nod].left=a[nod].right=dr-st+1;
if(st!=dr)
{
build(nod*2,st,mj);
build(nod*2+1,mj+1,dr);
}
}
int main()
{
f>>n>>m;
int t,x,y;
build(1,1,n);
while(m--)
{
f>>t;
if(t==1)
{
f>>x>>y;
update(1,1,n,x,x+y-1,-1);
}
else
if(t==2)
{
f>>x>>y;
update(1,1,n,x,x+y-1,1);
}
else
g<<a[1].val<<'\n';
}
return 0;
}