#include<bits/stdc++.h>
using namespace std;
struct aj
{
int x,st,dr;
};
aj aint[400005];
int lazy[400005];
inline void update(int node, int st, int dr, int stt, int drr, int _)
{
if(lazy[node]==-1)
{
lazy[node]=0;
lazy[2*node]=-1;
lazy[2*node+1]=-1;
}
else if(lazy[node]==1)
{
lazy[2*node]=1;
lazy[2*node+1]=1;
}
if(_==-1) lazy[node]=0;
if(stt<=st&&dr<=drr)
{
lazy[node]=_;
return;
}
int med=(st+dr)>>1;
if(stt<=med) update(2*node,st,med,stt,drr,_);
if(med<drr) update(2*node+1,med+1,dr,stt,drr,_);
}
void query(int node, int st, int dr)
{
if(lazy[node]==1)
{
aint[node].x=aint[node].st=aint[node].dr=dr-st+1;
return;
}
else if(lazy[node]==-1)
{
aint[node].x=aint[node].st=aint[node].dr=0;
return;
}
if(st==dr) return;
int med=(st+dr)>>1;
query(2*node,st,med);
query(2*node+1,med+1,dr);
aint[node].st=aint[2*node].st;
aint[node].dr=aint[2*node+1].dr;
aint[node].st+= (aint[2*node].st == med-st+1) ? aint[2*node+1].st : 0;
aint[node].dr+= (aint[2*node+1].dr == dr-med) ? aint[2*node].dr : 0;
aint[node].x = max(max(aint[2*node].x,aint[2*node+1].x),aint[2*node].dr+aint[2*node+1].st);
}
int main()
{
freopen("hotel.in","r",stdin);
freopen("hotel.out","w",stdout);
int x,y,type,n,q;
scanf("%d%d",&n,&q);
for(register int i=1;i<=4*n;i++)
lazy[i]=1;
for(register int i=1;i<=q;i++)
{
scanf("%d",&type);
if(!(type-1))
{
scanf("%d%d",&x,&y);
update(1,1,n,x,x+y-1,-1);
}
else if(!(type-2))
{
scanf("%d%d",&x,&y);
update(1,1,n,x,x+y-1,1);
}
else
{
query(1,1,n);
printf("%d\n",aint[1].x);
}
}
return 0;
}