#include <fstream>
using namespace std;
ifstream cin ("hotel.in");
ofstream cout ("hotel.out");
int beg[1000100],endd[1000100],heap[1000100];
int n,m,lft,rght,val1,val2,l;
void up_date (int st,int dr,int nod)
{
if(st>=lft && dr<=rght) {beg[nod]=val1,endd[nod]=val2,heap[nod]=val2-val1+1; if(val1==-1) heap[nod]=-1; }
else
{
int mij=(st+dr)/2;
if(lft<=mij) up_date(st,mij,nod*2);
if(rght>mij) up_date(mij+1,dr,nod*2+1);
heap[nod]=max(heap[nod*2],heap[nod*2+1]);
if(beg[nod*2]==beg[nod*2+1]) beg[nod]=beg[nod*2]; else beg[nod]=-2;
if(endd[nod*2]==endd[nod*2+1]) endd[nod]=endd[nod*2]; else endd[nod]=-2;
}
}
void ask_me (int st,int dr,int nod)
{
if(lft>=st && lft<=dr && beg[nod]!=-2) { val1=beg[nod]; val2=endd[nod]; }
else
{
int mij=(st+dr)/2;
if(lft<=mij) ask_me(st,mij,nod*2);
else ask_me(mij+1,dr,nod*2+1);
}
}
void solve_1 (int a,int b)
{ lft=a; ask_me(1,n,1);
int c=val1,d=val2;
lft=a; rght=b; val1=val2=-1;
up_date(1,n,1);
lft=c; rght=a-1; val1=c; val2=a-1;
if(lft<=rght) up_date(1,n,1);
lft=b+1; rght=d; val1=lft; val2=d;
if(lft<=rght) up_date(1,n,1);
}
void solve_2 (int a,int b)
{
lft=a-1; if(lft>=1 && lft<=n) ask_me(1,n,1); else val1=-1;
int c=val1; if(c==-1) c=a;
lft=b+1; if(lft>=1 && lft<=n) ask_me(1,n,1); else val2=-1;
int d=val2; if(d==-1) d=b;
val1=c; val2=d; lft=c; rght=d;
up_date(1,n,1);
}
void read ()
{ int p;
cin>>n>>m;
beg[1]=1; endd[1]=n;
l=1; heap[1]=n; int a,b;
for(int i=1;i<=m;i++)
{
cin>>p;
if(p==1)
{
cin>>a>>b;
b=a+b-1;
solve_1(a,b);
}
else if(p==2)
{
cin>>a>>b;
b=a+b-1;
solve_2(a,b);
}
else cout<<heap[1]<<"\n";
}
}
int main()
{
read();
cin.close();
cout.close();
return 0;
}