#include<bits/stdc++.h>
#define int long long
using namespace std;
struct coord
{
int st, dr, max;
};
const int NMAX = 5e5 + 5, INF = 1e12 + 7;
int n, m, v[NMAX], lazy[4 * NMAX], dur[NMAX];
coord arbint[4 * NMAX];
void upd_lazy(int poz, int st, int dr)
{
if(lazy[poz] == 1)
arbint[poz] = {dr - st + 1, dr - st + 1, dr - st + 1};
else
arbint[poz] = {0, 0, 0};
if(st != dr)
{
lazy[poz * 2] = lazy[poz];
lazy[poz * 2 + 1 ] = lazy[poz];
}
lazy[poz] = -INF;
}
void update(int val, int st, int dr, int arbst, int arbdr, int arbpoz)
{
dur[arbpoz] = arbdr - arbst + 1;
if(lazy[arbpoz] != -INF)
upd_lazy(arbpoz, arbst, arbdr);
if(dr < arbst || st > arbdr || st > dr)
return;
if(arbst >= st && arbdr <= dr)
{
lazy[arbpoz] = val;
upd_lazy(arbpoz, arbst, arbdr);
return;
}
int mij = (arbst + arbdr) / 2;
update(val, st, dr, mij + 1, arbdr, arbpoz * 2 + 1);
update(val, st, dr, arbst, mij, arbpoz * 2);
arbint[arbpoz].st = arbint[arbpoz * 2].st;
if(arbint[arbpoz * 2].max == dur[arbpoz * 2])
arbint[arbpoz].st = dur[arbpoz * 2] + arbint[arbpoz * 2 + 1].st;
arbint[arbpoz].dr = arbint[arbpoz * 2 + 1].dr;
if(arbint[arbpoz * 2 + 1].max == dur[arbpoz * 2 + 1])
arbint[arbpoz].dr = dur[arbpoz * 2 + 1] + arbint[arbpoz * 2].dr;
arbint[arbpoz].max = max(arbint[arbpoz * 2].max, max(arbint[arbpoz * 2 + 1].max, arbint[arbpoz * 2].dr + arbint[arbpoz * 2 + 1].st));
}
int32_t main()
{
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
freopen("hotel.in", "r", stdin);
freopen("hotel.out", "w", stdout);
cin >> n >> m;
update(1, 1, n, 1, n, 1);
int c, a, b;
for(int i = 1; i <= m; i++)
{
cin >> c;
if(c == 1)
{
cin >> a >> b;
update(0, a, a + b - 1, 1, n, 1);
}
else if(c == 2)
{
cin >> a >> b;
update(1, a, a + b - 1, 1, n, 1);
}
else if(c == 3)
{
cout << arbint[1].max << "\n";
}
}
}