#include <fstream>
using namespace std;
const int MAXARB=262144;
int lmax[MAXARB],ls[MAXARB],ld[MAXARB];
void ocupa(int nod, int st, int dr, int X, int Y)
{
if (X<=st && dr<=Y) {
lmax[nod]=ls[nod]=ld[nod]=0;
return;
}
int fs=nod<<1, fd=(nod<<1)+1, mij=(st+dr)>>1;
if (lmax[nod]==dr-st+1) {
lmax[fs]=ls[fs]=ld[fs]=mij-st+1;
lmax[fd]=ls[fd]=ld[fd]=dr-mij;
}
if (X<=mij) ocupa(fs,st,mij,X,Y);
if (mij<Y) ocupa(fd,mij+1,dr,X,Y);
lmax[nod]=max(max(lmax[fs],lmax[fd]),ld[fs]+ls[fd]);
if (ls[fs]==mij-st+1) ls[nod]=ls[fs]+ls[fd];
else ls[nod]=ls[fs];
if (ld[fd]==dr-mij) ld[nod]=ld[fs]+ld[fd];
else ld[nod]=ld[fd];
}
void elibereaza(int nod, int st, int dr, int X, int Y)
{
if (X<=st && dr<=Y) {
lmax[nod]=ls[nod]=ld[nod]=dr-st+1;
return;
}
int fs=nod<<1, fd=(nod<<1)+1, mij=(st+dr)>>1;
if (lmax[nod]==0) {
lmax[fs]=ls[fs]=ld[fs]=0;
lmax[fd]=ls[fd]=ld[fd]=0;
}
if (X<=mij) elibereaza(fs,st,mij,X,Y);
if (mij<Y) elibereaza(fd,mij+1,dr,X,Y);
lmax[nod]=max(max(lmax[fs],lmax[fd]),ld[fs]+ls[fd]);
if (ls[fs]==mij-st+1) ls[nod]=ls[fs]+ls[fd];
else ls[nod]=ls[fs];
if (ld[fd]==dr-mij) ld[nod]=ld[fs]+ld[fd];
else ld[nod]=ld[fd];
}
int main()
{
ifstream fin("hotel.in"); ofstream fout("hotel.out");
int n,T,top,x,y;
fin>>n>>T;
lmax[1]=ls[1]=ld[1]=n;
while (T--)
{
fin>>top;
switch (top)
{
case 3: { fout<<lmax[1]<<"\n"; break; }
case 1: { fin>>x>>y;
ocupa(1,1,n,x,x+y-1);
break;
}
case 2: { fin>>x>>y;
elibereaza(1,1,n,x,x+y-1);
break;
}
}
}
fin.close(); fout.close();
return 0;
}