#include <bits/stdc++.h>
using namespace std;
ifstream fin("hotel.in");
ofstream fout("hotel.out");
int n,m,A,B,C,i;
struct nod {int st,dr,Max;}a[400010];
void build(int nod,int st,int dr)
{
int mij=(st+dr)/2;
a[nod].st=a[nod].dr=a[nod].Max=dr-st+1;
if(mij!=st)build(nod*2,st,mij);
if(mij!=dr)build(nod*2+1,mij,dr);
}
void update(int nod,int l,int r,int st,int dr,int caz)
{
if(dr<l||st>r||l>r)
return;
if(st<=l&&r<=dr)
{
if(caz==1)
a[nod].st=a[nod].dr=a[nod].Max=r-l+1;
else a[nod].st=a[nod].dr=a[nod].Max=0;
return;
}
int m=(l+r)/2;
if(a[nod].Max==0)
{
a[nod<<1].st=a[nod<<1].dr=a[nod<<1].Max=0;
a[nod<<1|1].st=a[nod<<1|1].dr=a[nod<<1|1].Max=0;
}
else if(a[nod].Max==r-l+1)
{
a[nod<<1].st=a[nod<<1].dr=a[nod<<1].Max=m-l+1;
a[nod<<1|1].st=a[nod<<1|1].dr=a[nod<<1|1].Max=r-m;
}
update(nod<<1,l,m,st,dr,caz);
update(nod<<1|1,m+1,r,st,dr,caz);
a[nod].st=a[nod<<1].st;
if(a[nod<<1].st==m-l+1)a[nod].st+=a[nod<<1|1].st;
a[nod].dr=a[nod<<1|1].dr;
if(a[nod<<1|1].dr==r-m)a[nod].dr+=a[nod<<1].dr;
a[nod].Max=max(a[nod<<1].Max,a[nod<<1|1].Max);
a[nod].Max=max(a[nod].Max,a[nod<<1].dr+a[nod<<1|1].st);
}
int main()
{
fin>>n>>m;
for(i=1;i<=n;i++)
update(1,1,n,i,i,1);
for(i=1;i<=m;i++)
{
fin>>C;
if(C==3)
fout<<a[1].Max<<'\n';
else
{
fin>>A>>B;
if(C==1)
update(1,1,n,A,A+B-1,0);
if(C==2)
update(1,1,n,A,A+B-1,1);
}
}
return 0;
}