#include<stdio.h>
#include<algorithm>
using namespace std;
int n,x,y;
struct Nod
{
int med,st,dr;
void set(int val)
{
med=st=dr=val;
}
}aint[500000];
inline int max(int a,int b,int c)
{
int ans=a;
if(ans<b) ans=b;
if(ans<c) ans=c;
return ans;
}
void init(int nod, int st, int dr)
{
aint[nod].set(dr-st+1);
if(st==dr)
return;
int med=(st+dr)>>1;
init(2*nod,st,med);
init(2*nod+1,med+1,dr);
}
void update1(int nod, int st, int dr)
{
if(st>=x && dr<=y)
{
aint[nod].set(0);
return;
}
int med=(st+dr)/2;
if(aint[nod].med==dr-st+1)
aint[2*nod ].set(med-st+1),
aint[2*nod+1].set(dr-med);
if(aint[nod].med==0)
aint[2*nod].set(0),
aint[2*nod+1].set(0);
if(med>=x)
update1(2*nod,st,med);
if(med<y)
update1(2*nod+1,med+1,dr);
aint[nod].st=aint[2*nod].st;
if(aint[2*nod].st==med-st+1)
aint[nod].st+=aint[2*nod+1].st;
aint[nod].dr=aint[2*nod+1].dr;
if(aint[2*nod+1].med==dr-med)
aint[nod].dr+=aint[2*nod].dr;
aint[nod].med= max(
aint[2*nod].med,
aint[2*nod+1].med,
aint[2*nod].dr+aint[2*nod+1].st
);
}
void update2(int nod, int st, int dr)
{
if(st>=x && dr<=y)
{
aint[nod].set(dr-st+1);
return;
}
int med=(st+dr)/2;
if(aint[nod].med==0)
aint[2*nod].set(0),
aint[2*nod+1].set(0);
if(aint[nod].med==dr-st+1)
aint[2*nod].set(med-st+1),
aint[2*nod+1].set(dr-med);
if(med>=x)
update2(2*nod, st, med);
if(med<y)
update2(2*nod+1, med+1, dr);
aint[nod].st=aint[2*nod].st;
if(aint[2*nod].st==med-st+1)
aint[nod].st+=aint[2*nod+1].st;
aint[nod].dr=aint[2*nod+1].dr;
if(aint[2*nod+1].dr==dr-med)
aint[nod].dr+=aint[2*nod].dr;
aint[nod].med=max(
aint[2*nod].med,
aint[2*nod+1].med,
aint[2*nod].dr+aint[2*nod+1].st
);
}
int main()
{
int i,op,p;
freopen("hotel.in","r",stdin);
freopen("hotel.out","w",stdout);
scanf("%d%d",&n,&p);
init(1,1,n);
for(i=1;i<=p;++i)
{
scanf("%d",&op);
if(op==1)
{
scanf("%d%d",&x,&y);
y+=x-1;
update1(1,1,n);
}
if(op==2)
{
scanf("%d%d",&x,&y);
y+=x-1;
update2(1,1,n);
}
if(op==3)
printf("%d\n",aint[1].med);
}
return 0;
}