#include<stdio.h>
#define N 1<<18
#define liber 0
#define ocupat 1
#define mixt 2
#define ocupare 1
#define eliberare 2
#define intrebare 3
long stanga[N],dreapta[N],maxim[N],stare[N],
n,p,operatie,inceput,sfarsit,cate;
void citeste(long *variabila);
void citire();
void ocupa(long nod,long prima,long ultima);
void elibereaza(long nod,long prima,long ultima);
int main()
{ citire();
for(;p;p--)
{ citeste(&operatie);
if(operatie==intrebare)
{ printf("%ld\n",maxim[1]);continue;}
citeste(&inceput),citeste(&cate);
sfarsit=inceput+cate-1;
if(operatie==ocupare)ocupa(1,1,n);
if(operatie==eliberare) elibereaza(1,1,n);
}
return 0;
}
void citire()
{
freopen("hotel.in","r",stdin);
freopen("hotel.out","w",stdout);
scanf("%ld%ld",&n,&p);
maxim[1]=n;stare[1]=liber;
}
void citeste(long *variabila)
{
scanf("%ld",variabila);
}
void ocupa(long nod,long prima,long ultima)
{ long fs,fd,mijloc,max1,max2,max3,max4;
fs=nod<<1;fd=fs+1;
if(inceput<=prima&&ultima<=sfarsit)
{ maxim[nod]=0;stare[nod]=ocupat;
return;
}
mijloc=(prima+ultima)>>1;
if(stare[nod]==liber)
{ stare[fs]=liber;maxim[fs]=mijloc-prima+1;
stare[fd]=liber;maxim[fd]=ultima-mijloc;
}
stare[nod]=mixt;
if(inceput<=mijloc)ocupa(fs,prima,mijloc);
if(sfarsit>mijloc)ocupa(fd,mijloc+1,ultima);
if(stare[fs]==liber)
{ if(stare[fd]==liber)
{ stare[nod]=liber;maxim[nod]=maxim[fs]+maxim[fd];return;}
if(stare[fd]==ocupat)
{ stanga[nod]=maxim[fs];dreapta[nod]=0;maxim[nod]=maxim[fs];return;}
if(stare[fd]==mixt)
{ stanga[nod]=maxim[fs]+stanga[fd];dreapta[nod]=dreapta[fd];
maxim[nod]=(stanga[nod]>dreapta[nod])?stanga[nod]:dreapta[nod];
maxim[nod]=(maxim[nod]>maxim[fd])?maxim[nod]:maxim[fd];return;
}
}
if(stare[fs]==mixt)
{ if(stare[fd]==liber)
{ stanga[nod]=stanga[fs];dreapta[nod]=dreapta[fs]+maxim[fd];
maxim[nod]=(stanga[nod]>dreapta[nod])?stanga[nod]:dreapta[nod];
maxim[nod]=(maxim[nod]>maxim[fs])?maxim[nod]:maxim[fs];
}
if(stare[fd]==mixt)
{ stanga[nod]=stanga[fs];dreapta[nod]=dreapta[fd];
max1=stanga[fs];max2=dreapta[fd];max3=dreapta[fs]+stanga[fd];
max4=(maxim[fs]>maxim[fd])?maxim[fs]:maxim[fd];
max1=(max1>max3)?max1:max3;
max2=(max2>max4)?max2:max4;
maxim[nod]=(max1>max2)?max1:max2;
}
if(stare[fd]==ocupat)
{ stanga[nod]=stanga[fs];dreapta[nod]=0;
maxim[nod]=(stanga[fs]>dreapta[fs])?stanga[fs]:dreapta[fs];
maxim[nod]=(maxim[nod]>maxim[fs])?maxim[nod]:maxim[fs];
}
}
if(stare[fs]==ocupat)
{ if(stare[fd]==liber)
{ stanga[nod]=0;dreapta[nod]=maxim[fd];maxim[nod]=maxim[fd];}
if(stare[fd]==mixt)
{ stanga[nod]=0;dreapta[nod]=dreapta[fd];
maxim[nod]=(stanga[fd]>dreapta[fd])?stanga[fd]:dreapta[fd];
maxim[nod]=(maxim[nod]>maxim[fd])?maxim[nod]:maxim[fd];
}
if(stare[fd]==ocupat)
{ stare[nod]=ocupat;maxim[nod]=0;}
}
}
void elibereaza(long nod,long prima,long ultima)
{ long fs,fd,mijloc,max1,max2,max3,max4;
fs=nod<<1;fd=fs+1;
if(inceput<=prima&&ultima<=sfarsit)
{ maxim[nod]=ultima-prima+1;stare[nod]=liber;
return;
}
mijloc=(prima+ultima)>>1;
if(stare[nod]==ocupat)
{ stare[fs]=ocupat;maxim[fs]=0;
stare[fd]=ocupat;maxim[fd]=0;
}
stare[nod]=mixt;
if(inceput<=mijloc)elibereaza(fs,prima,mijloc);
if(sfarsit>mijloc)elibereaza(fd,mijloc+1,ultima);
if(stare[fs]==liber)
{ if(stare[fd]==liber)
{ stare[nod]=liber;maxim[nod]=maxim[fs]+maxim[fd];return;}
if(stare[fd]==ocupat)
{ stanga[nod]=maxim[fs];dreapta[nod]=0;maxim[nod]=maxim[fs];return;}
if(stare[fd]==mixt)
{ stanga[nod]=maxim[fs]+stanga[fd];dreapta[nod]=dreapta[fd];
maxim[nod]=(stanga[nod]>dreapta[nod])?stanga[nod]:dreapta[nod];
maxim[nod]=(maxim[nod]>maxim[fd])?maxim[nod]:maxim[fd];return;
}
}
if(stare[fs]==mixt)
{ if(stare[fd]==liber)
{ stanga[nod]=stanga[fs];dreapta[nod]=dreapta[fs]+maxim[fd];
maxim[nod]=(stanga[nod]>dreapta[nod])?stanga[nod]:dreapta[nod];
maxim[nod]=(maxim[nod]>maxim[fs])?maxim[nod]:maxim[fs];
}
if(stare[fd]==mixt)
{ stanga[nod]=stanga[fs];dreapta[nod]=dreapta[fd];
max1=stanga[fs];max2=dreapta[fd];max3=dreapta[fs]+stanga[fd];
max4=(maxim[fs]>maxim[fd])?maxim[fs]:maxim[fd];
max1=(max1>max3)?max1:max3;
max2=(max2>max4)?max2:max4;
maxim[nod]=(max1>max2)?max1:max2;
}
if(stare[fd]==ocupat)
{ stanga[nod]=stanga[fs];dreapta[nod]=0;
maxim[nod]=(stanga[fs]>dreapta[fs])?stanga[fs]:dreapta[fs];
maxim[nod]=(maxim[nod]>maxim[fs])?maxim[nod]:maxim[fs];
}
}
if(stare[fs]==ocupat)
{ if(stare[fd]==liber)
{ stanga[nod]=0;dreapta[nod]=maxim[fd];maxim[nod]=maxim[fd];}
if(stare[fd]==mixt)
{ stanga[nod]=0;dreapta[nod]=dreapta[fd];
maxim[nod]=(stanga[fd]>dreapta[fd])?stanga[fd]:dreapta[fd];
maxim[nod]=(maxim[nod]>maxim[fd])?maxim[nod]:maxim[fd];
}
if(stare[fd]==ocupat)
{ stare[nod]=ocupat;maxim[nod]=0;}
}
}