#include <fstream>
#define nmax 100005
using namespace std;
ifstream f("hotel.in");
ofstream g("hotel.out");
int i,n,p,c,a,b;
int arb[4*nmax],arbs[4*nmax],arbd[4*nmax],lazy[8*nmax];
void init(int nod,int st,int dr)
{
if(st!=dr)
{
arb[nod]=arbs[nod]=arbd[nod]=dr-st+1;
int mid=(st+dr)/2;
init(2*nod,st,mid);
init(2*nod+1,mid+1,dr);
}
else
{
arb[nod]=arbs[nod]=arbd[nod]=dr-st+1;
}
}
void propag(int nod)
{
if(lazy[nod]==-1) return;
if(lazy[nod]==0)
{lazy[nod]=-1;
lazy[2*nod]=lazy[2*nod+1]=0;
arbs[2*nod]=arbd[2*nod]=arb[2*nod]=arbs[2*nod+1]=arbd[2*nod+1]=arb[2*nod+1]=0;
}
else
{
lazy[2*nod]=lazy[2*nod+1]=lazy[nod]/2;
lazy[2*nod]+=lazy[nod]%2;
arbs[2*nod]=arbd[2*nod]=arb[2*nod]=lazy[nod]/2+lazy[nod]%2;
arbs[2*nod+1]=arbd[2*nod+1]=arb[2*nod+1]=lazy[nod]/2;
lazy[nod]=-1;
}
}
void upd1(int nod,int st,int dr,int a,int b)
{
if(a<=st&&dr<=b)
{
propag(nod);
lazy[nod]=0;
arb[nod]=arbs[nod]=arbd[nod]=0;
}
else
{
propag(nod);
int mid=(st+dr)/2;
if(a<=mid) upd1(2*nod,st,mid,a,b);
if(b>mid) upd1(2*nod+1,mid+1,dr,a,b);
arb[nod]=max(max(arb[2*nod],arb[2*nod+1]),arbd[2*nod]+arbs[2*nod+1]);
arbs[nod]=arbs[2*nod];
arbd[nod]=arbd[2*nod+1];
if(arbs[2*nod]==mid-st+1) arbs[nod]+=arbs[2*nod+1];
if(arbd[2*nod+1]==dr-mid) arbd[nod]+=arbd[2*nod];
}
}
void upd2(int nod,int st,int dr,int a,int b)
{
if(a<=st&&dr<=b)
{
propag(nod);
lazy[nod]=b-a+1;
arb[nod]=arbs[nod]=arbd[nod]=dr-st+1;
}
else
{
propag(nod);
int mid=(st+dr)/2;
if(a<=mid) upd2(2*nod,st,mid,a,b);
if(b>mid) upd2(2*nod+1,mid+1,dr,a,b);
arb[nod]=max(max(arb[2*nod],arb[2*nod+1]),arbd[2*nod]+arbs[2*nod+1]);
arbs[nod]=arbs[2*nod];
arbd[nod]=arbd[2*nod+1];
if(arbs[2*nod]==mid-st+1) arbs[nod]+=arbs[2*nod+1];
if(arbd[2*nod+1]==dr-mid) arbd[nod]+=arbd[2*nod];
}
}
int main()
{
f>>n>>p;
init(1,1,n);
for(i=1;i<=4*nmax;i++) lazy[i]=-1;
for(i=1;i<=p;i++)
{
f>>c;
if(c==1) {f>>a>>b;upd1(1,1,n,a,a+b-1);}
if(c==2) {f>>a>>b;upd2(1,1,n,a,a+b-1);}
if(c==3) {propag(1);g<<arb[1]<<'\n';}
}
return 0;
}