#include<stdio.h>
#include<string.h>
FILE*fin=fopen("hotel.in","r");
FILE*fout=fopen("hotel.out","w");
#define nm 400000
#define max(a,b)((a)>(b)?(a):(b))
int n,p,lfs[nm],lst[nm],ldr[nm];
void buildt(int nod,int l,int r)
{
if(l>r) return ;
if(l==r)
{
lfs[nod]=1;
lst[nod]=1;
ldr[nod]=1;
return ;
}
int mid=(l+r)/2;
lfs[nod]=lst[nod]=ldr[nod]=r-l+1;
buildt(2*nod,l,mid);
buildt(2*nod+1,mid+1,r);
}
void update(int nod,int l,int r,int a,int b,int v,int pass)
{
if(a<=l&&r<=b)
{
if(v){lfs[nod]=lst[nod]=ldr[nod]=0;}
else{lfs[nod]=lst[nod]=ldr[nod]=r-l+1;}
return ;
}
int mid=(l+r)/2,pc=pass,udr=0,ust=0,ls=nod<<1,rs=ls+1;
if(pass<0&&lfs[nod]==r-l+1) pc=0;
if(pass<0&&lfs[nod]==0) pc=1;
if(a<=mid)
{
ust=1;
update(2*nod,l,mid,a,b,v,pc);
}
if(b>=mid+1)
{
udr=1;
update(2*nod+1,mid+1,r,a,b,v,pc);
}
if(pc==0)
{
if(!ust){lfs[ls]=lst[ls]=ldr[ls]=mid-l+1;}
if(!udr){lfs[rs]=lst[rs]=ldr[rs]=r-mid;}
}
else if(pc==1)
{
if(!ust){lfs[ls]=lst[ls]=ldr[ls]=0;}
if(!udr){lfs[rs]=lst[rs]=ldr[rs]=0;}
}
lfs[nod]=max(lfs[ls],lfs[rs]);
lfs[nod]=max(lfs[nod],ldr[ls]+lst[rs]);
lst[nod]=lst[ls];
if(lst[ls]==mid-l+1) lst[nod]+=lst[rs];
ldr[nod]=ldr[rs];
if(ldr[rs]==r-mid) ldr[nod]+=ldr[ls];
}
int main()
{
int i,a,b,q;
fscanf(fin,"%d%d",&n,&p);
buildt(1,1,n);
for(i=1;i<=p;i++)
{
fscanf(fin,"%d",&q);
if(q==1||q==2)
{
fscanf(fin,"%d%d",&a,&b);
b=a+b-1;
update(1,1,n,a,b,q%2,-1);
}
else fprintf(fout,"%d\n",lfs[1]);
}
fclose(fin);
fclose(fout);
return 0;
}