#include<fstream>
#define N 100100
using namespace std;
ifstream f("hotel.in");
ofstream g("hotel.out");
int n,m,i,op,x,y;
struct arbint{int sol,st,dr;}aint[N * 4];
inline void update(int nod,int li,int ls,int st,int dr,int val){
if(st <= li && ls <= dr){
aint[nod].st = aint[nod].dr = aint[nod].sol = val * (ls - li + 1);
return ;
}
int mij = (li + ls) >> 1;
if(aint[nod].sol == 0)
aint[nod << 1].sol = aint[nod << 1].st = aint[nod << 1].dr = aint[(nod << 1) | 1].sol = aint[(nod << 1) | 1].st = aint[(nod << 1) | 1].dr = 0;
if(aint[nod].sol == ls - li + 1)
aint[nod << 1].sol = aint[nod << 1].st = aint[nod << 1].dr = mij - li + 1,
aint[(nod << 1) | 1].sol = aint[(nod << 1) | 1].st = aint[(nod << 1) | 1].dr = ls - mij;
if(st <= mij)
update(nod << 1, li, mij, st, dr, val);
if(mij < dr)
update((nod << 1) | 1, mij + 1, ls, st, dr, val);
if(aint[nod << 1].st == mij - li + 1)
aint[nod].st = aint[nod << 1].st + aint[(nod << 1) | 1].st;
else
aint[nod].st = aint[nod << 1].st;
if(aint[(nod << 1) | 1].dr == ls - mij)
aint[nod].dr = aint[nod << 1].dr + aint[(nod << 1) | 1].dr;
else
aint[nod].dr = aint[(nod << 1) | 1].dr;
aint[nod].sol = max(max(aint[nod << 1].sol, aint[(nod << 1) | 1].sol), aint[nod << 1].dr + aint[(nod << 1) | 1].st);
}
int main()
{
f >> n >> m;
update(1, 1, n, 1, n, 1);
for(i = 1; i <= m; ++i)
{
f >> op;
if(op == 1)
f >> x >> y,
update(1, 1, n, x, x + y - 1, 0);
else
if(op == 2)
f >> x >> y,
update(1, 1, n, x, x + y - 1, 1);
else
g << aint[1].sol << '\n';
}
return 0;
}