#include <fstream>
using namespace std;
ifstream fin("hotel.in");
ofstream fout("hotel.out");
int n,v[100001],m,c,a,b,x,val,l,nr,lmax;
struct nod
{
int x,st,dr,ss,flag,flagx;
}aib[400001];
void build(int nod,int st,int dr)
{
if(st==dr)
{
aib[nod].x=v[st];
aib[nod].flag=0;
aib[nod].st=aib[nod].dr=aib[nod].ss=1;
aib[nod].flagx=0;
}
else if(st<dr)
{
int mid=(st+dr)/2;
build(nod*2,st,mid);
build(nod*2+1,mid+1,dr);
aib[nod].x=min(aib[nod*2].x,aib[nod*2+1].x);
aib[nod].flag=0;
aib[nod].st=aib[nod].dr=aib[nod].ss=dr-st+1;
aib[nod].flagx=0;
}
}
void update(int nod,int st,int dr,int a,int b,int x)
{
if(a<=st && dr<=b){
aib[nod].x=x;
aib[nod].flag=1;
aib[nod].flagx=x;
if(x==0)
aib[nod].st=aib[nod].dr=aib[nod].ss=dr-st+1;
else
aib[nod].st=aib[nod].dr=aib[nod].ss=0;
}
else
{
int mid=(st+dr)/2;
if(aib[nod].flag==1)
{
int xc=aib[nod].flagx;
aib[2*nod].x=aib[nod].x;
aib[2*nod].flag=1;
aib[2*nod+1].x=aib[nod].x;
aib[2*nod+1].flag=1;
aib[nod].flag=0;
if(xc==1){
aib[nod*2].st=aib[nod*2].dr=aib[nod*2].ss=0;
aib[nod*2+1].st=aib[nod*2+1].dr=aib[nod*2+1].ss=0;
}
else{
aib[nod*2].st=aib[nod*2].dr=aib[nod*2].ss=mid-st+1;
aib[nod*2+1].st=aib[nod*2+1].dr=aib[nod*2+1].ss=dr-mid;
}
aib[nod*2].flagx=aib[nod*2+1].flagx=xc;
}
if(a<=mid)
{
update(nod*2,st,mid,a,b,x);
}
if(b>=mid+1)
update(nod*2+1,mid+1,dr,a,b,x);
aib[nod].x=min(aib[nod*2].x,aib[nod*2+1].x);
aib[nod].ss=max(aib[nod*2].dr+aib[nod*2+1].st,aib[nod*2].ss);
aib[nod].ss=max(aib[nod].ss,aib[nod*2+1].ss);
aib[nod].st=aib[nod*2].st;
if(aib[nod*2].st==mid-st+1)
aib[nod].st=aib[nod*2].st+aib[nod*2+1].st;
aib[nod].dr=aib[nod*2+1].dr;
if(aib[nod*2+1].dr==dr-mid)
aib[nod].dr=aib[nod*2].dr+aib[nod*2+1].dr;
}
}
int main()
{
fin>>n>>m;
build(1,1,n);
for(int i=1;i<=m;i++)
{
fin>>c;
if(c==1)
{
fin>>l>>nr;
update(1,1,n,l,l+nr-1,1);
}
else if(c==2)
{
fin>>l>>nr;
update(1,1,n,l,l+nr-1,0);
}
else
{
fout<<aib[1].ss<<"\n";
}
}
return 0;
}