#pragma region Top
#include<cstdio>
int n,m,i,maxim,x,y,O;
char c[100],*b;
struct AI{int left,right,middle;};
AI a[300000];
int M(int a,int b)
{
if(a>b)
return a;
return b;
}
inline void readline()
{
gets(c);
b=c;
while(*b==' ') ++b;
O=*b-'0';
++b;
if(O==3) return;
while(*b==' ')++b;
x=0;
while(*b!=' '){x=x*10+*b-'0';++b;}
while(*b==' ')++b;
y=0;
while(*b>='0'&&*b<='9'){y=y*10+*b-'0';++b;}
}
#pragma endregion
void add(int poz,int st,int dr,int x,int y)
{
if(x<=st && dr<=y)
{
a[poz].left=a[poz].right=a[poz].middle=0;
return;
}
int mij=(st+dr)>>1,p=poz<<1;
if(a[poz].left==dr-st+1)
{
a[p].left=a[p].right=a[p].middle=mij-st+1;
a[p+1].left=a[p+1].right=a[p+1].middle=dr-mij;
}
if(x<=mij)
add(p,st,mij,x,y);
if(mij<y)
add(p+1,mij+1,dr,x,y);
if(!(x<=st && dr<=y))
{
if(a[p].left==mij-st+1)
a[poz].left=a[p].left+a[p+1].left;
else
a[poz].left=a[p].left;
if(a[p+1].right==dr-mij)
a[poz].right=a[p].right+a[p+1].right;
else
a[poz].right=a[p+1].right;
a[poz].middle=M(M(a[p].middle,a[p+1].middle),a[p].right+a[p+1].left);
}
}
void remove(int poz,int st,int dr,int x,int y)
{
if(x<=st && dr<=y)
{
a[poz].left=a[poz].right=a[poz].middle=dr-st+1;
return;
}
int mij=(st+dr)>>1,p=poz<<1;
if(a[poz].left==0 && a[poz].middle==0 && a[poz].right==0)
{
a[p].left=a[p].right=a[p].middle=0;
a[p+1].left=a[p+1].right=a[p+1].middle=0;
}
if(x<=mij)
remove(p,st,mij,x,y);
if(mij<y)
remove(p+1,mij+1,dr,x,y);
if(!(x<=st && dr<=y))
{
if(a[p].left==mij-st+1)
a[poz].left=a[p].left+a[p+1].left;
else
a[poz].left=a[p].left;
if(a[p+1].right==dr-mij)
a[poz].right=a[p].right+a[p+1].right;
else
a[poz].right=a[p+1].right;
a[poz].middle=M(M(a[p].middle,a[p+1].middle),a[p].right+a[p+1].left);
}
}
int main()
{
freopen("hotel.in","r",stdin);
freopen("hotel.out","w",stdout);
scanf("%d %d ",&n,&m);
a[1].left=a[1].right=a[1].middle=n;
for(i=1;i<=m;i++){
readline();
switch(O){
case 1:add(1,1,n,x,x+y-1);break;
case 2:remove(1,1,n,x,x+y-1);break;
case 3:printf("%d\n",M(a[1].left,M(a[1].right,a[1].middle)));break;}}
fclose(stdout);
return 0;
}