# include <bits/stdc++.h>
# define max(a,b,c) max(max(a,b),c)
using namespace std;
ifstream fi("hotel.in");
ofstream fo("hotel.out");
const int nmax = 1e5 + 5;
struct arb
{
int ans,pr,su;
} s[nmax<<2];
void init(int nod,int val)
{
s[nod].ans = s[nod].pr = s[nod].su = val;
}
void update(int p,int u,int st,int dr,int nod,int type)
{
if (p > u) return;
if (st <= p && u <= dr) {if (type == 2) init(nod,u - p + 1);else init(nod,0);}
else
{
int m = (p + u) >> 1;
if (!s[nod].ans) init(nod<<1,0),init((nod<<1)+1,0);
if (s[nod].ans == u - p + 1) init(nod<<1,m - p + 1),init((nod<<1)+1,u-m);
if (st <= m) update(p,m,st,dr,nod<<1,type);
if (m < dr) update(m+1,u,st,dr,(nod<<1)+1,type);
s[nod].ans = max(s[nod<<1].ans,s[(nod<<1)+1].ans,s[nod<<1].su + s[(nod<<1)+1].pr);
s[nod].pr = s[(nod<<1)].pr;if (s[nod].pr == m - p + 1) s[nod].pr += s[(nod<<1)+1].pr;
s[nod].su = s[(nod<<1)+1].su;if (s[nod].su == u - m) s[nod].su += s[nod<<1].su;
}
}
int main(void)
{
int n,m;
fi>>n>>m;
update(1,n,1,n,1,2);
int ok,x,y;
while (m --)
{
fi>>ok;
if (ok < 3) fi>>x>>y,y+=x-1,update(1,n,x,y,1,ok);else fo << s[1].ans << '\n';
}
return 0;
}