#include <bits/stdc++.h>
using namespace std;
int n,p;
struct Arbore
{
int lungime;
int st,dr;
bool unit;
} arb[200010];
void build(int nod, int st, int dr)
{
if(st==dr)
{
arb[nod].lungime=1;
arb[nod].st=arb[nod].dr=1;
arb[nod].unit=1;
return;
}
int mid=(st+dr)/2;
build(nod*2,st,mid);
build(nod*2+1,mid+1,dr);
arb[nod].lungime=arb[nod*2].lungime+arb[nod*2+1].lungime;
arb[nod].st=arb[nod].dr=arb[nod].lungime;
arb[nod].unit=1;
}
void upgrade(int nod,int st, int dr, int dela, int pinala, int value)
{
if(st==dr)
{
arb[nod].lungime=value;
arb[nod].st=arb[nod].dr=value;
arb[nod].unit=value;
return;
}
int mid=(st+dr)/2;
if(pinala<=mid) upgrade(nod*2,st,mid,dela,pinala,value);
else if(dela>mid) upgrade(nod*2+1,mid+1,dr,dela,pinala,value);
else
{
upgrade(nod*2,st,mid,dela,pinala,value);
upgrade(nod*2+1,mid+1,dr,dela,pinala,value);
}
if(arb[nod*2].st)
{
if(arb[nod*2].unit)
{
if(arb[nod*2+1].st)
{
if(arb[nod*2+1].unit)
{
arb[nod].st=arb[nod].dr=arb[nod*2].lungime+arb[nod*2+1].lungime;
arb[nod].unit=1;
}
else
{
arb[nod].st=arb[nod*2].lungime+arb[nod*2+1].st;
arb[nod].unit=0;
}
}
else
{
arb[nod].st=arb[nod*2].st;
arb[nod].unit=0;
}
}
else
{
arb[nod].st=arb[nod*2].st;
arb[nod].unit=0;
}
}
else
{
arb[nod].st=0;
arb[nod].unit=0;
}
if(arb[nod].unit)
{}
else
{
if(arb[nod*2+1].dr)
{
if(arb[nod*2+1].unit)
{
if(arb[nod*2].dr)
{
arb[nod].dr=arb[nod*2].dr+arb[nod*2+1].dr;
}
else
{
arb[nod].dr=arb[nod*2+1].dr;
}
}
else
{
arb[nod].dr=arb[nod*2+1].dr;
}
}
else
{
arb[nod].dr=arb[nod*2+1].dr;
}
}
arb[nod].lungime=max(max(arb[nod].dr,arb[nod].st),arb[nod*2].dr+arb[nod*2+1].st);
}
int main()
{
ifstream cin("hotel.in");
ofstream cout("hotel.out");
cin>>n>>p;
build(1,1,n);
for(int i=1;i<=p;i++)
{
int ceck,a,b;
cin>>ceck;
if(ceck==1)
{
cin>>a>>b;
upgrade(1,1,n,a,a+b-1,0);
}
if(ceck==2)
{
cin>>a>>b;
upgrade(1,1,n,a,a+b-1,1);
}
if(ceck==3) cout<<arb[1].lungime<<'\n';
}
return 0;
}