#include<cstdio>
#include<algorithm>
#define NMAX 100000+5
#define KMAX (1<<18)+5
using namespace std;
struct nod
{
int lc,lst,ldr;
};
int N,P,K,Type,A,B;
nod AI[KMAX];
void adauga(int R,int lo,int hi)
{
int md=(lo+hi)/2;
if(A<=lo && hi<=B)
{
AI[R].lc=AI[R].lst=AI[R].ldr=0;
return;
}
if(AI[R].lc==(hi-lo+1))
{
AI[2*R].lc=AI[2*R].lst=AI[2*R].ldr=(md-lo+1);
AI[2*R+1].lc=AI[2*R+1].lst=AI[2*R+1].ldr=(hi-md);
}
if(A<=md) adauga(2*R,lo,md);
if(md+1<=B) adauga(2*R+1,md+1,hi);
AI[R].lc=max(AI[2*R].ldr+AI[2*R+1].lst,max(AI[2*R].lc,AI[2*R+1].lc));
if(AI[2*R].lst==(md-lo+1)) AI[R].lst=(md-lo+1)+AI[2*R+1].lst;
else AI[R].lst=AI[2*R].lst;
if(AI[2*R+1].ldr==(hi-md)) AI[R].ldr=AI[2*R].ldr+(hi-md);
else AI[R].ldr=AI[2*R+1].ldr;
}
void scoate(int R,int lo,int hi)
{
int md=(lo+hi)/2;
if(A<=lo && hi<=B)
{
AI[R].lc=AI[R].lst=AI[R].ldr=(hi-lo+1);
return;
}
if(AI[R].lc==0) AI[2*R].lc=AI[2*R].lst=AI[2*R].ldr=AI[2*R+1].lc=AI[2*R+1].lst=AI[2*R+1].ldr=0;
if(A<=md) scoate(2*R,lo,md);
if(md+1<=B) scoate(2*R+1,md+1,hi);
AI[R].lc=max(AI[2*R].ldr+AI[2*R+1].lst,max(AI[2*R].lc,AI[2*R+1].lc));
if(AI[2*R].lst==(md-lo+1)) AI[R].lst=(md-lo+1)+AI[2*R+1].lst;
else AI[R].lst=AI[2*R].lst;
if(AI[2*R+1].ldr==(hi-md)) AI[R].ldr=AI[2*R].ldr+(hi-md);
else AI[R].ldr=AI[2*R+1].ldr;
}
int main()
{
int i,j,x;
freopen("hotel.in","r",stdin);
freopen("hotel.out","w",stdout);
scanf("%d%d",&N,&P);
AI[1].lst=AI[1].ldr=AI[1].lc=N;
for(;P;--P)
{
scanf("%d",&x);
if(x==3)
{
printf("%d\n",AI[1].lc);
continue;
}
scanf("%d%d",&A,&B); B+=A-1;
if(x==1) adauga(1,1,N);
else scoate(1,1,N);
/*for(i=1,j=2;i<=2*K-1;i++)
{
printf("Nodul %d: %d in stanga, %d in dreapta, %d general\n",i,AI[i].lst,AI[i].ldr,AI[i].lc);
if(i==j-1) {printf("\n"); j<<=1;}
}
printf("----------------\n\n");*/
}
return 0;
}