#include <bits/stdc++.h>
using namespace std;
int n,aint[400005],lefti[400005],righti[400005],lazy[400005];
void update(int st,int dr,int nod,int stu,int dru,int val)
{
if(stu<=st&&dru>=dr)
{
aint[nod]=(dr-st+1)*val;
lefti[nod]=(dr-st+1)*val;
righti[nod]=(dr-st+1)*val;
lazy[nod]=val;
return;
}
if(lazy[nod]>-1)
{
lazy[2*nod]=lazy[2*nod+1]=lazy[nod];
aint[2*nod]=aint[2*nod+1]=(dr-st+1)*lazy[nod]/2;
lefti[2*nod]=lefti[2*nod+1]=(dr-st+1)*lazy[nod]/2;
righti[2*nod]=righti[2*nod+1]=(dr-st+1)*lazy[nod]/2;
lazy[nod]=-1;
}
if(stu<=(st+dr)/2)
{
update(st,(st+dr)/2,2*nod,stu,dru,val);
}
if(dru>(st+dr)/2)
{
update((st+dr)/2+1,dr,2*nod+1,stu,dru,val);
}
if(lefti[2*nod]==(st+dr)/2-st+1)
{
lefti[nod] = lefti[2*nod] + lefti[2*nod+1];
}
else
{
lefti[nod] = lefti[2*nod];
}
if(righti[2*nod+1]==dr-(st+dr)/2)
{
righti[nod] = righti[2*nod+1] + righti[2*nod];
}
else
{
righti[nod] = righti[2*nod+1];
}
aint[nod] = max(aint[2*nod],max(aint[2*nod+1],righti[2*nod]+lefti[2*nod+1]));
}
int querry (int st, int dr, int nod, int stq, int drq)
{
if(stq<=st&&drq>=dr)
{
return aint[nod];
}
if(lazy[nod]>-1)
{
lazy[2*nod]=lazy[2*nod+1]=lazy[nod];
aint[2*nod]=aint[2*nod+1]=(dr-st+1)*lazy[nod]/2;
lefti[2*nod]=lefti[2*nod+1]=(dr-st+1)*lazy[nod]/2;
righti[2*nod]=righti[2*nod+1]=(dr-st+1)*lazy[nod]/2;
lazy[nod]=-1;
}
int ma=-1;
if(stq<=(st+dr)/2)
{
ma = max(ma,querry(st,(st+dr)/2,2*nod,stq,drq));
}
if(drq>(st+dr)/2)
{
ma = max(ma,querry((st+dr)/2+1,dr,2*nod+1,stq,drq));
}
int rmi=min(righti[2*nod],(st+dr/2)-stq+1);
int lmi=min(lefti[2*nod+1],drq-(st+dr)/2);
ma = max (ma,lmi+rmi);
return ma;
}
int main()
{
ifstream cin("hotel.in");
ofstream cout("hotel.out");
int m, cn;
cin>>n>>m;
cn=n;
int p=1;
while(p<n)
{
p=p*2;
}
n=p;
update(1,n,1,1,cn,1);
int t,a,b;
for(int i=1;i<=m;i++)
{
cin>>t;
if(t==1||t==2)
{
cin>>a>>b;
update(1,n,1,a,a+b-1,t-1);
}
else
{
cout<<querry(1,n,1,1,cn)<<"\n";
}
}
return 0;
}