#include<fstream.h>
# define maxn 300300
int l[maxn],r[maxn],max[maxn],sw[maxn];
void update1 (int st, int dr, int x, int y, int k)
{
if (st>=x && dr<=y)
{
sw[k]=1;
l[k]=r[k]=max[k]=0;
}
else
{
int mij=(st+dr)/2;
if (sw[k]==1)
{
sw[k]=0;
sw[2*k]=sw[2*k+1]=1;
if (mij>=x)
update1 (st,mij,x,y,2*k);
else
max[2*k]=l[2*k]=r[2*k]=mij-st+1;
if (mij<y)
update1 (mij+1,dr,x,y,2*k+1);
else
max[2*k+1]=l[2*k+1]=r[2*k+1]=dr-mij;
}
else
{
if (mij>=x)
update1(st,mij,x,y,2*k);
if (mij<y)
update1(mij+1,dr,x,y,2*k+1);
}
if (l[2*k]==mij-st+1)
l[k]=l[2*k]+l[2*k+1];
else
l[k]=l[2*k];
if (r[2*k+1]==dr-mij)
r[k]=r[2*k+1]+r[2*k];
else
r[k]=r[2*k+1];
max[k]=l[k];
if (max[k]<r[k]) max[k]=r[k];
if (l[2*k+1]+r[2*k]>max[k])
max[k]=l[2*k+1]+r[2*k];
if (max[k]<max[2*k])
max[k]=max[2*k];
if (max[k]<max[2*k+1])
max[k]=max[2*k+1];
}
}
void update2( int st, int dr, int x, int y, int k)
{
if (st>=x && dr<=y)
{
sw[k]=1;
max[k]=l[k]=r[k]=dr-st+1;
}
else
{
int mij=(st+dr)/2;
if (sw[k]==1)
{
sw[k]=0;
sw[2*k]=sw[2*k+1]=1;
if (mij>=x)
update2 (st,mij,x,y,2*k);
else
max[2*k]=l[2*k]=r[2*k]=0;
if (mij<y)
update2 (mij+1,dr,x,y,2*k+1);
else
max[2*k+1]=l[2*k+1]=r[2*k+1]=0;
}
else
{
if (x<=mij)
update2 (st,mij,x,y,2*k);
if (mij<y)
update2 (mij+1,dr,x,y,2*k+1);
}
if (l[2*k]==mij-st+1)
l[k]=l[2*k]+l[2*k+1];
else
l[k]=l[2*k];
if (r[2*k+1]==dr-mij)
r[k]=r[2*k+1]+r[2*k];
else
r[k]=r[2*k+1];
max[k]=l[k];
if (max[k]<r[k]) max[k]=r[k];
if (l[2*k+1]+r[2*k]>max[k])
max[k]=l[2*k+1]+r[2*k];
if (max[k]<max[2*k])
max[k]=max[2*k];
if (max[k]<max[2*k+1])
max[k]=max[2*k+1];
}
}
void solve()
{
int n,m,i,x,y,op;
ifstream f("hotel.in");
ofstream g("hotel.out");
f>>n>>m;
sw[1]=1;
l[1]=r[1]=max[1]=n;
for (i=1;i<=m;i++)
{
f>>op;
if (op==1)
{
f>>x>>y;
update1(1,n,x,x+y-1,1);
}
else if (op==2)
{
f>>x>>y;
update2(1,n,x,y+x-1,1);
}
else
g<<max[1]<<'\n';
}
f.close();
g.close();
}
int main()
{
solve();
return 0;
}