#include <fstream>
using namespace std;
const int NMAX = 1e5 + 1;
struct nod
{
int sum, sst, sdr;
bool upd;
nod(int val = 0, bool update = 1)
{
sum = sst = sdr = val;
upd = update;
}
} aib[4 * NMAX];
ifstream fin("hotel.in");
ofstream fout("hotel.out");
int n, m, nrn[4 * NMAX];
void build(int rad, int st, int dr)
{
if(st == dr)
{
nrn[rad] = 1;
aib[rad] = nod(1, 0);
return;
}
int mij = (st + dr) / 2;
build(2 * rad, st, mij);
build(2 * rad + 1, mij + 1, dr);
nrn[rad] = dr - st + 1;
aib[rad] = nod(nrn[rad], 0);
}
void updateNod(int rad)
{
if(!aib[rad].upd) return;
if(aib[rad].sum)
{
aib[2 * rad] = nod(nrn[2 * rad]);
aib[2 * rad + 1] = nod(nrn[2 * rad + 1]);
}
else
{
aib[2 * rad] = nod();
aib[2 * rad + 1] = nod();
}
aib[rad].upd = 0;
}
void update(int rad, int st, int dr, int a, int b, bool val)
{
if(a <= st && b >= dr)
{
if(val) aib[rad] = nod(nrn[rad]);
else aib[rad] = nod();
return;
}
updateNod(rad);
int mij = (st + dr) / 2;
if(a <= mij) update(2 * rad, st, mij, a, b, val);
if(b > mij) update(2 * rad + 1, mij + 1, dr, a, b, val);
aib[rad].sum = max(aib[2 * rad].sum, aib[2 * rad + 1].sum);
aib[rad].sum = max(aib[rad].sum, aib[2 * rad].sdr + aib[2 * rad + 1].sst);
aib[rad].sst = aib[2 * rad].sst;
if(aib[2 * rad].sum && aib[2 * rad].sum == aib[2 * rad].sst) aib[rad].sst += aib[2 * rad + 1].sst;
aib[rad].sdr = aib[2 * rad + 1].sdr;
if(aib[2 * rad + 1].sum && aib[2 * rad + 1].sum == aib[2 * rad + 1].sdr) aib[rad].sdr += aib[2 * rad].sdr;
}
int main()
{
int op, a, b;
fin >> n >> m;
build(1, 1, n);
while(m--)
{
fin >> op;
if(op == 1)
{
fin >> a >> b;
update(1, 1, n, a, a + b - 1, 0);
}
else if(op == 2)
{
fin >> a >> b;
update(1, 1, n, a, a + b - 1, 1);
}
else fout << aib[1].sum << '\n';
}
return 0;
}