#include <bits/stdc++.h>
#define LIM 1<<17
/// TONI BO$$ was here
/// #MLC
using namespace std;
char BUF[LIM];
int poz;
inline char getChar(){
poz++;
if(poz>=LIM){
fread(BUF,LIM,1,stdin);
poz=0;
}
return BUF[poz];
}
inline int getNr(){
int r=0, semn=1;
char ch=getChar();
while(isdigit(ch)==0 && ch!='-') ch=getChar();
if(ch=='-'){
semn=-1;
ch=getChar();
}
while(isdigit(ch)!=0){
r=r*10+semn*(ch-'0');
ch=getChar();
}
return r;
}
int n;
struct gogu
{
int pref,suf,secv;
}arbint[500003];
void initialize(int st,int dr,int nod)
{
arbint[nod]={dr-st+1,dr-st+1,dr-st+1};
if(st>=dr)
return ;
int mij=(st+dr)/2;
initialize(st,mij,2*nod);
initialize(mij+1,dr,2*nod+1);
}
void _insert(int a,int b,int st,int dr,int nod)
{
int mij=(st+dr)/2,lg1=mij-st+1,lg2=dr-mij;
if(a<=st && b>=dr)
{
arbint[nod]={0,0,0};
if(st!=dr)
{
arbint[2*nod]={0,0,0};
arbint[2*nod+1]={0,0,0};
}
return ;
}
if(st!=dr && arbint[nod].secv==dr-st+1)
{
arbint[2*nod]={lg1,lg1,lg1};
arbint[2*nod+1]={lg2,lg2,lg2};
}
if(a<=mij)
_insert(a,b,st,mij,2*nod);
if(b>mij)
_insert(a,b,mij+1,dr,2*nod+1);
arbint[nod].secv=max(arbint[2*nod].secv,arbint[2*nod+1].secv);
arbint[nod].secv=max(arbint[nod].secv,arbint[2*nod].suf+arbint[2*nod+1].pref);
arbint[nod].pref=arbint[2*nod].pref+arbint[2*nod+1].pref*(arbint[2*nod].pref==lg1);
arbint[nod].suf=arbint[2*nod+1].suf+arbint[2*nod].suf*(arbint[2*nod+1].suf==lg2);
}
void _erase(int a,int b,int st,int dr,int nod)
{
int mij=(st+dr)/2,lg1=mij-st+1,lg2=dr-mij;
if(a<=st && b>=dr)
{
arbint[nod]={dr-st+1,dr-st+1,dr-st+1};
if(st!=dr)
{
arbint[2*nod]={lg1,lg1,lg1};
arbint[2*nod+1]={lg2,lg2,lg2};
}
return ;
}
if(st!=dr && arbint[nod].secv==0)
{
arbint[2*nod]={0,0,0};
arbint[2*nod+1]={0,0,0};
}
if(a<=mij)
_erase(a,b,st,mij,2*nod);
if(b>mij)
_erase(a,b,mij+1,dr,2*nod+1);
arbint[nod].secv=max(arbint[2*nod].secv,arbint[2*nod+1].secv);
arbint[nod].secv=max(arbint[nod].secv,arbint[2*nod].suf+arbint[2*nod+1].pref);
arbint[nod].pref=arbint[2*nod].pref+arbint[2*nod+1].pref*(arbint[2*nod].pref==lg1);
arbint[nod].suf=arbint[2*nod+1].suf+arbint[2*nod].suf*(arbint[2*nod+1].suf==lg2);
}
int main()
{
int m,q,a,b;
freopen("hotel.in","r",stdin);
freopen("hotel.out","w",stdout);
n=getNr();
m=getNr();
initialize(1,n,1);
while(m--)
{
q=getNr();
if(q==3)
{
printf("%d\n",arbint[1].secv);
continue ;
}
a=getNr();
b=getNr();
if(q==1)
_insert(a,a+b-1,1,n,1);
else
_erase(a,a+b-1,1,n,1);
}
return 0;
}