#include<cstdio>
#define MULT 100000
#define iszero(x) (tmax[x]==amax[x])
#define max(a,b) ((a)<(b)?(b):(a))
static int tstanga[MULT*17], tdreapta[MULT*17], tmax[MULT*17], amax[MULT*17], lazy[MULT*17];
void update(int n, int s, int e, int a, int b, int v)
{
if(s>=a && b>=e){
tstanga[n]=tdreapta[n]=tmax[n]=v?0:e-s+1;
lazy[n]=v+1;
return;
}
int m=(s+e)/2;
if(lazy[n]){
update(2*n , s , m, s , m, lazy[n]-1);
update(2*n+1, m+1, e, m+1, e, lazy[n]-1);
lazy[n]=0;
}
if(a<=m)
update(2*n , s , m, a, b, v);
if(b>m)
update(2*n+1, m+1, e, a, b, v);
if(iszero(2*n))
tstanga[n]=tstanga[2*n]+tstanga[2*n+1];
else
tstanga[n]=tstanga[2*n];
if(iszero(2*n+1))
tdreapta[n]=tdreapta[2*n+1]+tdreapta[2*n];
else
tdreapta[n]=tdreapta[2*n+1];
tmax[n]=max(max(tdreapta[2*n]+tstanga[2*n+1], tmax[2*n]), tmax[2*n+1]);
}
void init(int n, int s, int e)
{
tstanga[n]=tdreapta[n]=tmax[n]=amax[n]=e-s+1;
if(s!=e){
int m=(s+e)/2;
init(2*n , s , m);
init(2*n+1, m+1, e);
}
}
int main(void)
{
freopen("hotel.in","r",stdin);
#ifdef INFOARENA
freopen("hotel.out","w",stdout);
#endif
int n, p;
scanf("%d%d",&n,&p);
init(1,1,n);
while(p--){
int op;
scanf("%d",&op);
int a,b;
if(op!=3)
scanf("%d%d",&a,&b);
b=a+b-1;
switch(op){
case 1:
update(1,1,n,a,b,1);
break;
case 2:
update(1,1,n,a,b,0);
break;
case 3:
printf("%d\n",tmax[1]);
}
}
return 0;
}