#include <bits/stdc++.h>
using namespace std;
ifstream f ("hotel.in");
ofstream g ("hotel.out");
const int nmax=4e5+3;
struct
{
int st,dr,val,tot;
}v[nmax];
int lenes[nmax],sol,n,t,a,b,caz;
void update(int st,int dr,int nod,int a,int b,int val)
{
if(a<=st&&dr<=b)
{
if(val==1)
{
v[nod].val=dr-st+1;
v[nod].st=dr-st+1;
v[nod].dr=dr-st+1;
v[nod].tot=1;
lenes[nod]=1;
sol=max(sol,dr-st+1);
}
else if(val==2)
{
v[nod].val=0;
v[nod].st=0;
v[nod].dr=0;
v[nod].tot=0;
lenes[nod]=2;
}
return;
}
int mij=(st+dr)/2;
if(lenes[nod]==1)
{
v[2*nod].val=mij-st+1;
v[2*nod].st=mij-st+1;
v[2*nod].dr=mij-st+1;
v[2*nod].tot=1;
lenes[2*nod]=1;
v[2*nod+1].val=dr-mij;
v[2*nod+1].st=dr-mij;
v[2*nod+1].dr=dr-mij;
v[2*nod+1].tot=1;
lenes[2*nod+1]=1;
lenes[nod]=0;
sol=max(sol,dr-mij);
}
else if(lenes[nod]==2)
{
v[2*nod].val=0;
v[2*nod].st=0;
v[2*nod].dr=0;
v[2*nod].tot=0;
lenes[2*nod]=2;
v[2*nod+1].val=0;
v[2*nod+1].st=0;
v[2*nod+1].dr=0;
v[2*nod+1].tot=0;
lenes[2*nod+1]=2;
lenes[nod]=0;
}
if(a<=mij) update(st,mij,2*nod,a,b,val);
if(b>mij) update(mij+1,dr,2*nod+1,a,b,val);
v[nod].st=max(v[2*nod].st,v[2*nod].tot*(v[2*nod].val+v[2*nod+1].st));
v[nod].dr=max(v[2*nod+1].dr,v[2*nod+1].tot*(v[2*nod+1].val+v[2*nod].dr));
v[nod].tot=v[2*nod].tot*v[2*nod+1].tot;
v[nod].val=v[nod].tot*(v[2*nod].val+v[2*nod+1].val);
if(nod==1) sol=max(sol,v[2*nod].dr+v[2*nod+1].st);
sol=max(sol,v[nod].st);
sol=max(sol,v[nod].dr);
}
int main()
{
ios::sync_with_stdio(false);
f>>n>>t;
update(1,n,1,1,n,1);
sol=n;
while(t--)
{
f>>caz;
if(caz==1)
{
f>>a>>b;
b=b+a-1;
sol=0;
update(1,n,1,a,b,2);
}
if(caz==2)
{
f>>a>>b;
b=b+a-1;
sol=0;
update(1,n,1,a,b,1);
}
if(caz==3) g<<sol<<'\n';
//g<<v[1].st<<' '<<v[1].dr<<'\n';
}
return 0;
}