#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,flag;
}aib[400001];
void build(int nod,int st,int dr)
{
if(st==dr)
{
aib[nod].x=v[st];
aib[nod].flag=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;
}
}
void caut(int nod,int st,int dr)
{
if(st<dr && lmax<dr-st+1)
{
if(aib[nod].flag==1)
{
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(aib[nod].x==1)
lmax=max(lmax,dr-st+1);
else
{
int mid=(st+dr)/2;
caut(nod*2+1,mid+1,dr);
caut(nod*2,st,mid);
}
}
}
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;
}
else
{
if(aib[nod].flag==1)
{
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;
}
int mid=(st+dr)/2;
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);
}
}
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
{
lmax=0;
caut(1,1,n);
fout<<lmax<<"\n";
}
}
return 0;
}