#include<cstdio>
#include<bitset>
using namespace std;
int i,j,n,m,a[300010],st[300010],dr[300010],ma[300010];
int fol[300010];
int max(int x,int y)
{
if(x>y) return x;
return y;
}
void build(int i,int s,int d)
{
if(s>=d)
{
st[i]=dr[i]=ma[i]=1;
fol[i]=1;
return ;
}
int m=(s+d)/2,fiu1=i*2,fiu2=i*2+1;
build(fiu1,s,m);
build(fiu2,m+1,d);
if(fol[fiu1]&&fol[fiu2]&&a[fiu1]==a[fiu2]) fol[i]=1;
else fol[i]=0;
st[i]=st[fiu1];
if(fol[fiu1]&&!a[fiu1]) st[i]+=st[fiu2];
dr[i]=dr[fiu2];
if(fol[fiu2]&&!a[fiu2]) dr[i]+=dr[fiu1];
ma[i]=max(ma[fiu1],ma[fiu2]);
ma[i]=max(ma[i],st[i]);
ma[i]=max(ma[i],dr[i]);
ma[i]=max(ma[i],dr[fiu1]+st[fiu2]);
}
void update(int i,int s,int d,int p,int q,int val)
{
if(p<=s&&d<=q)
{
a[i]=val;
fol[i]=1;
if(a[i]) st[i]=dr[i]=ma[i]=0;
else st[i]=dr[i]=ma[i]=d-s+1;
return ;
}
int m=(s+d)/2,fiu1=i*2,fiu2=i*2+1;
if(fol[i])
{
fol[i]=0;
fol[fiu1]=fol[fiu2]=1;
a[fiu1]=a[fiu2]=a[i];
if(!a[i])
{
st[fiu1]=dr[fiu1]=ma[fiu1]=m-s+1;
st[fiu2]=dr[fiu2]=ma[fiu2]=d-m;
}
else
{
st[fiu1]=dr[fiu1]=ma[fiu1]=0;
st[fiu2]=dr[fiu2]=ma[fiu2]=0;
}
}
if(p<=m) update(fiu1,s,m,p,q,val);
if(q>m) update(fiu2,m+1,d,p,q,val);
if(fol[fiu1]&&fol[fiu2]&&a[fiu1]==a[fiu2]) fol[i]=1,a[i]=a[fiu1];
else fol[i]=0;
st[i]=st[fiu1];
if(fol[fiu1]&&!a[fiu1]) st[i]+=st[fiu2];
dr[i]=dr[fiu2];
if(fol[fiu2]&&!a[fiu2]) dr[i]+=dr[fiu1];
ma[i]=max(ma[fiu1],ma[fiu2]);
ma[i]=max(ma[i],st[i]);
ma[i]=max(ma[i],dr[i]);
ma[i]=max(ma[i],dr[fiu1]+st[fiu2]);
}
void afis(int a[])
{
for(int i=1;i<=35;++i) printf("%d ",a[i]);
printf("\n");
}
int main()
{
freopen("hotel.in","r",stdin);
freopen("hotel.out","w",stdout);
scanf("%d%d",&n,&m);
build(1,1,n);
for(i=1;i<=m;++i)
{
int tip,x,y;
scanf("%d",&tip);
if(tip==3) printf("%d\n",ma[1]);
else if(tip==2)
{
scanf("%d%d",&x,&y);
update(1,1,n,x,x+y-1,0);
}
else
{
scanf("%d%d",&x,&y);
update(1,1,n,x,x+y-1,1);
}
}
fclose(stdin);
fclose(stdout);
return 0;
}