#include <cstdio>
using namespace std;
int maxi[400001],lefti[400001],righti[400001],lu[400001];
int x,y,n,m,caz;
int maxim(int x, int y){if(x>y)return x;return y;}
void update2(int x, int y, int z);
void update1(int nod, int left, int right)
{
if((x<=left)&&(right<=y))
{
maxi[nod]=0;
lefti[nod]=0;
righti[nod]=0;
lu[nod]=1;
return ;
}
int piv=(left+right)/2;
if(lu[nod]==2)
{
int aux1=x, aux2=y;
lu[nod]=0;
x=left;y=right;
update2(2*nod,left,piv);
update2(2*nod+1,piv+1,right);
x=aux1;y=aux2;
}
if(x<=piv){update1(2*nod,left,piv);}
if(piv<y){update1(2*nod+1,piv+1,right);}
if(lefti[2*nod]==piv-left+1){lefti[nod]=piv-left+1+lefti[2*nod+1];}else{lefti[nod]=lefti[2*nod];}
if(righti[2*nod+1]==right-piv){righti[nod]=right-piv+righti[2*nod];}else{righti[nod]=righti[2*nod+1];}
maxi[nod]=maxim(maxim(maxi[2*nod],maxi[2*nod+1]),righti[2*nod]+lefti[2*nod+1]);
}
void update2(int nod, int left, int right)
{
if((x<=left)&&(right<=y))
{
maxi[nod]=right-left+1;
lefti[nod]=right-left+1;
righti[nod]=right-left+1;
lu[nod]=2;
return ;
}
int piv=(left+right)/2;
if(lu[nod]==1)
{
lu[nod]=0;
int aux1=x, aux2=y;
x=left;y=right;
update1(2*nod,left,piv);
update1(2*nod+1,piv+1,right);
x=aux1;y=aux2;
}
if(x<=piv){update2(2*nod,left,piv);}
if(piv<y){update2(2*nod+1,piv+1,right);}
if(lefti[2*nod]==piv-left+1){lefti[nod]=piv-left+1+lefti[2*nod+1];}else{lefti[nod]=lefti[2*nod];}
if(righti[2*nod+1]==right-piv){righti[nod]=right-piv+righti[2*nod];}else{righti[nod]=righti[2*nod+1];}
maxi[nod]=maxim(maxim(maxi[2*nod],maxi[2*nod+1]),righti[2*nod]+lefti[2*nod+1]);
}
int main()
{
freopen("hotel.in","r",stdin);
freopen("hotel.out","w",stdout);
scanf("%d%d",&n,&m);
x=1;
y=n;
update2(1,1,n);
while(m--)
{
scanf("%d",&caz);
if(caz==1)
{
scanf("%d%d",&x,&y);
y=x+y-1;
update1(1,1,n);
}
if(caz==2)
{
scanf("%d%d",&x,&y);
y=x+y-1;
update2(1,1,n);
}
if(caz==3)
{
printf("%d\n",maxi[1]);
}
}
return 0;
}