#include<cstdio>
#define MAX_N 100000
#define MAX_A 262144
using namespace std;
class nod{
public:
int prefix,sufix,lmax;
void init1(){
prefix=0;
sufix=0;
lmax=0;
}
void init0(int l){
prefix=l;
sufix=l;
lmax=l;
}
};
nod aint[MAX_A];
int st,dr,ce;
int max(int a,int b,int c){
if (a>=b &&a>=c) return a;
else
if (b>=a &&b>=c) return b;
else return c;
}
void build(int i,int begin,int end){
int mid;
aint[i].init0(end-begin+1);
if (begin==end) return ;
mid=(begin+end)/2;
build(i*2,begin,mid);
build(i*2+1,mid+1,end);
}
void update(int i,int begin,int end){
int mid=(begin+end)/2;
if (st<=begin &&dr>=end){
if (ce==0) aint[i].init0(end-begin+1);
else aint[i].init1();
return ;
}
if (aint[i].lmax==0){
aint[i*2].init1();
aint[i*2+1].init1();
}
else
if (aint[i].lmax==end-begin+1){
aint[i*2].init0(mid-begin+1);
aint[i*2+1].init0(end-mid);
}
if (dr<=mid) update(i*2,begin,mid);
else
if (st>mid) update(i*2+1,mid+1,end);
else {
update(i*2,begin,mid);
update(i*2+1,mid+1,end);
}
if (aint[i*2].prefix==mid-begin+1) aint[i].prefix=aint[i*2].prefix+aint[i*2+1].prefix;
else aint[i].prefix=aint[i*2].prefix;
if (aint[i*2+1].sufix==end-mid) aint[i].sufix=aint[i*2].sufix+aint[i*2+1].sufix;
else aint[i].sufix=aint[i*2+1].sufix;
aint[i].lmax=max(aint[i*2].lmax,aint[i*2+1].lmax,aint[i*2].sufix+aint[i*2+1].prefix);
}
int main(){
freopen ("hotel.in","r",stdin);
freopen ("hotel.out","w",stdout);
int n,i,p,op;
scanf ("%d%d",&n,&p);
build(1,1,n);
for(i=1;i<=p;i++){
scanf ("%d",&op);
if (op==1){
scanf ("%d%d",&st,&dr);
dr=st+dr-1;
ce=1;
update(1,1,n);
}
else
if (op==2){
scanf ("%d%d",&st,&dr);
dr=st+dr-1;
ce=0;
update(1,1,n);
}
else printf ("%d\n",aint[1].lmax);
}
return 0;
}