#include <bits/stdc++.h>
#pragma optimize GCC ("Ofast")
#pragma GCC optimize("O3")
#pragma GCC optimize("unroll-loops")
///#include <tryhardmode>
///#include <GODMODE::ON>
using namespace std;
ifstream fin ("hotel.in");
ofstream fout ("hotel.out");
const int NMAX=1e5+5;
bool lazy[4*NMAX];
int v[NMAX];
struct elem{
int prefix;
int sufix;
int subarray;
int length;
}aint[4*NMAX];
elem solve(elem l,elem r)
{
elem aux;
if(l.prefix==l.length)
aux.prefix=l.length+r.prefix;
else
aux.prefix=l.prefix;
if(r.sufix==r.length)
aux.sufix=r.length+l.sufix;
else
aux.sufix=r.sufix;
aux.subarray=max({l.subarray,r.subarray,l.sufix+r.prefix});
aux.length=l.length+r.length;
return aux;
}
void build(long long p,long long st,long long dr)
{
long long mij;
if(st==dr)
{
aint[p]={1,1,1,1};
return ;
}
else
{
mij=st+dr;
mij/=2;
build(2*p,st,mij);
build(2*p+1,mij+1,dr);
aint[p]=solve(aint[2*p],aint[2*p+1]);
}
}
void compute_node(int p,int node)
{
if(aint[p].subarray)
{
aint[p].sufix=0;
aint[p].prefix=0;
aint[p].subarray=0;
}
else
{
aint[p].sufix=aint[node].length;
aint[p].prefix=aint[node].length;
aint[p].subarray=aint[node].length;
}
}
void propag(int p,int st,int dr)
{
if(st!=dr)
{
if(lazy[p]==0)
return ;
compute_node(2*p,p);
compute_node(2*p+1,p);
lazy[2*p]+=lazy[p];
lazy[2*p+1]+=lazy[p];
lazy[p]=0;
}
}
void update(int p,int st,int dr,int a,int b)
{
propag(p,st,dr);
if(a<=st && dr<=b)
{
lazy[p]+=1;
compute_node(p,p);
return ;
}
else
{
int mij=st+dr;
mij/=2;
if(a<=mij)
update(2*p,st,mij,a,b);
if(mij<b)
update(2*p+1,mij+1,dr,a,b);
aint[p]=solve(aint[2*p],aint[2*p+1]);
}
}
elem query(int p,int st,int dr,int l,int r)
{
int mij;
elem a,b;
propag(p,st,dr);
if(l<=st && dr<=r)
return aint[p];
else
{
mij=st+dr;
mij/=2;
if(l<=mij)
return query(2*p,st,mij,l,r);
if(mij<r)
return query(2*p+1,mij+1,dr,l,r);
a=query(2*p,st,mij,l,r);
b=query(2*p+1,mij+1,dr,l,r);
return solve(a,b);
}
}
int main()
{
ios_base::sync_with_stdio(false);
fin.tie(NULL);
fout.tie(NULL);
int n,q,t;
fin>>n>>q;
build(1,1,n);
while(q--)
{
int x,y;
fin>>t;
if(t==1)
{
fin>>x>>y;
update(1,1,n,x,x+y-1);
}
else if(t==2)
{
fin>>x>>y;
update(1,1,n,x,x+y-1);
}
else
fout<<query(1,1,n,1,n).subarray<<"\n";
}
fin.tie();
fout.tie();
return 0;
}