#include <bits/stdc++.h>
using namespace std;
ifstream f("hotel.in");
ofstream g("hotel.out");
long long aint[400005], lazy[400005], st[400005], dr[400005], x[400005];
void prop(int node, int l, int r)
{
if(lazy[node]!= -1)
{
if(lazy[node])
{
st[node] = dr[node] = x[node] = 0;
if(l != r)
lazy[node * 2] = lazy[node * 2 + 1] = 1;
}
else
{
st[node] = dr[node] = x[node] = r - l + 1;
if(l != r)
lazy[node * 2] = lazy[node * 2 + 1] = 0;
}
}
lazy[node] = -1;
}
void update(int node, int l, int r, int ql, int qr, bool val)
{
bool ok = 1;
if(lazy[node] != -1)
prop(node, l, r);
if(qr < l || r < ql)
ok = 0;
if(ok == 1)
{
if(ql<=l && r<=qr)
{
lazy[node]=val;
prop(node, l, r);
ok = 0;
}
if(ok == 1)
{
int mij = (l + r)/2;
update(node * 2, l, mij, ql, qr, val);
update(node*2 + 1, mij + 1, r, ql, qr, val);
if(st[node * 2] == mij - l + 1)
st[node] = st[node * 2] + st[node * 2 + 1];
else
st[node] = st[node * 2];
if(dr[node * 2 + 1] == r - mij)
dr[node] = dr[node * 2] + dr[node * 2 + 1];
else
dr[node] = dr[node * 2 + 1];
x[node] = max({x[node * 2], x[node * 2 + 1], st[node * 2 + 1]+dr[node * 2]});
}
}
}
int main()
{
int n, p, tip, a, b, i;
f >> n >> p;
for(i = 0; i <= n * 4 + 1; ++i)
lazy[i] = -1;
update(1, 1, n, 1, n, 0);
for(i = 1; i <= p; i++)
{
f >> tip;
if(tip == 1)
{
f >> a >> b;
update(1, 1, n, a, a + b - 1, 1);
}
else
if(tip == 2)
{
f >> a >> b;
update(1, 1, n, a, a + b-1, 0);
}
else
if(tip == 3)
g << x[1] << "\n";
}
return 0;
}