#include <fstream>
#define NMAX 100005
using namespace std;
ifstream in("hotel.in");
ofstream out("hotel.out");
struct ok{
int l, r, val, maxx, lungime;
};
ok aint[2 * NMAX];
int dirty[2 * NMAX];
void push(int node, int leftson, int rightson)
{
dirty[leftson] = dirty[leftson] + dirty[node];
aint[leftson].val = aint[leftson].val + dirty[node];
dirty[rightson] = dirty[rightson] + dirty[node];
aint[rightson].val = aint[rightson].val + dirty[node];
if (dirty[node] == -1)
{
aint[leftson].l = aint[leftson].lungime;
aint[leftson].r = aint[leftson].lungime;
aint[leftson].maxx = aint[leftson].lungime;
}
else if (dirty[node] == 1)
{
aint[leftson].l = 0;
aint[leftson].r = 0;
aint[leftson].maxx = 0;
}
if (dirty[node] == -1)
{
aint[rightson].l = aint[rightson].lungime;
aint[rightson].r = aint[rightson].lungime;
aint[rightson].maxx = aint[rightson].lungime;
}
else if (dirty[node] == 1)
{
aint[rightson].l = 0;
aint[rightson].r = 0;
aint[rightson].maxx = 0;
}
dirty[node] = 0;
}
void update(int node, int nleft, int nright, int st, int dr, int val)
{
//out << nleft << " " << nright << " " << (st <= nleft && nright <= dr) << " " << node << " ";
int nmid = (nleft + nright) / 2;
int leftson = node + 1;
int rightson = node + 2 * (nmid - nleft + 1);
//out << " -> " << nleft << " " << nmid << " " << leftson << " sau " << nmid + 1 << " " << nright << " " << rightson << '\n';
if (st <= nleft && nright <= dr)
{
dirty[node] = val;
aint[node].val = aint[node].val + val;
if (val == -1)
{
aint[node].l = nright - nleft + 1;
aint[node].r = nright - nleft + 1;
aint[node].maxx = nright - nleft + 1;
}
else if (val == 1)
{
aint[node].l = 0;
aint[node].r = 0;
aint[node].maxx = 0;
}
if (nleft != nright)
push(node, leftson, rightson);
else if (nleft == nright)
dirty[node] = 0;
return;
}
if (nleft != nright)
{
push(node, leftson, rightson);
if (st <= nmid)
update(leftson, nleft, nmid, st, dr, val);
if (nmid < dr)
update(rightson, nmid + 1, nright, st, dr, val);
aint[node].maxx = max(aint[leftson].maxx, max(aint[rightson].maxx, aint[leftson].r + aint[rightson].l));
aint[node].l = aint[leftson].l;
if (aint[leftson].l == aint[leftson].lungime)
aint[node].l = aint[node].l + aint[rightson].l;
aint[node].r = aint[rightson].r;
if (aint[rightson].r == aint[rightson].lungime)
aint[node].r = aint[node].r + aint[leftson].r;
aint[node].maxx = max(aint[node].maxx, max(aint[node].l, aint[node].r));
}
}
void build(int node, int nleft, int nright)
{
if (nleft == nright)
{
aint[node].lungime = 1;
aint[node].maxx = 1;
aint[node].l = 1;
aint[node].r = 1;
return;
}
int nmid = (nleft + nright) / 2;
int leftson = node + 1;
int rightson = node + 2 * (nmid - nleft + 1);
build(leftson, nleft, nmid);
build(rightson, nmid + 1, nright);
aint[node].lungime = aint[leftson].lungime + aint[rightson].lungime;
aint[node].maxx = aint[node].lungime;
aint[node].l = aint[leftson].l + aint[rightson].l;
aint[node].r = aint[leftson].r + aint[rightson].r;
}
int main()
{
int n, p, i, j, a, b, c;
in >> n >> p;
build(1, 1, n);
/*for (i = 1; i <= 2 * n; ++i)
out << aint[i].maxx << " ";
out << '\n';*/
for (i = 1; i <= p; ++i)
{
in >> c;
if (c == 1)
{
in >> a >> b;
update(1, 1, n, a, a + b - 1, 1);
/*for (j = 1; j <= 2 * n; ++j)
out << aint[j].maxx << " ";
out << '\n';
out << '\n';*/
}
else if (c == 2)
{
in >> a >> b;
update(1, 1, n, a, a + b - 1, -1);
/*for (j = 1; j <= 2 * n; ++j)
out << aint[j].maxx << " ";
out << '\n';
out << '\n';*/
}
else if (c == 3)
{
out << aint[1].maxx << '\n';
}
}
/*for (i = 1; i <= 2 * n; ++i)
out << aint[i].maxx << " ";*/
return 0;
}