#include <bits/stdc++.h>
using namespace std;
int v[200005],aint[400005],n,lazy[400005],left1[400005],right1[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;
left1[nod]=(dr-st+1)*val;
right1[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;
left1[2*nod]=left1[2*nod+1]=(dr-st+1)*lazy[nod]/2;
right1[2*nod]=right1[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(left1[2*nod]==(st+dr)/2-st+1)
{
left1[nod] = left1[2*nod] + left1[2*nod+1];
}
else
{
left1[nod] = left1[2*nod];
}
if(right1[2*nod+1]==dr-(st+dr)/2)
{
right1[nod] = right1[2*nod+1] + right1[2*nod];
}
else
{
right1[nod] = right1[2*nod+1];
}
aint[nod] = max(aint[2*nod],max(aint[2*nod+1],right1[2*nod]+left1[2*nod+1]));
}
int querry1(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;
left1[2*nod]=left1[2*nod+1]=(dr-st+1)*lazy[nod]/2;
right1[2*nod]=right1[2*nod+1]=(dr-st+1)*lazy[nod]/2;
lazy[nod]=-1;
}
int ma=-1;
if(stq<=(st+dr)/2)
{
ma = max(ma,querry1(st,(st+dr)/2,2*nod,stq,drq));
}
if(drq>(st+dr)/2)
{
ma = max(ma,querry1((st+dr)/2+1,dr,2*nod+1,stq,drq));
}
int rm1=min(right1[2*nod],(st+dr/2)-stq+1);
int lm1=min(left1[2*nod+1],drq-(st+dr)/2);
ma = max (ma,lm1+rm1);
return ma;
}
int main()
{
ifstream cin("hotel.in");
ofstream cout("hotel.out");
int m;
cin>>n>>m;
int put=1;
int cpn=n;
while(put<n)
{
put=put*2;
}
n=put;
update(1,n,1,1,cpn,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<<querry1(1,n,1,1,cpn)<<"\n";
}
}
return 0;
}