#include <bits/stdc++.h>
using namespace std;
const int max_size = 1e5 + 1, max_seg = 4e5 + 1;
int n, q, op, i, gsize, v[max_size], aint[max_seg], lazy[max_seg];
// v[i] = is_free[i]
void init(int l, int r, int nod)
{
if (l == r)
{
aint[nod] = v[l];
return;
}
int m = (l + r) / 2;
init(l, m, nod * 2);
init(m + 1, r, nod * 2 + 1);
aint[nod] = aint[nod * 2] + aint[nod * 2 + 1];
}
void push(int l, int r, int nod)
{
if (l != r)
{
aint[nod << 1] += lazy[nod];
aint[(nod << 1) + 1] += lazy[nod];
lazy[nod << 1] += lazy[nod];
lazy[(nod << 1) + 1] += lazy[nod];
}
lazy[nod] = 0;
}
void update(int l, int r, int st, int dr, int val, int nod)
{
if (st <= l && r <= dr)
{
lazy[nod] += val;
aint[nod] += val * (r - l + 1);
return;
}
push(l, r, nod);
int m = l + r >> 1;
if (st <= m)
update(l, m, st, dr, val, nod << 1);
if (m + 1 <= dr)
update(m + 1, r, st, dr, val, (nod << 1) + 1);
aint[nod] = aint[nod << 1] + aint[(nod << 1) + 1];
}
int main()
{
freopen("hotel.in", "r", stdin);
freopen("hotel.out", "w", stdout);
ios::sync_with_stdio(0);
cin.tie(0);
cin >> n >> q;
for (int i = 1; i <= n; ++i)
v[i] = 1;
init(1, n, 1);
while (q--)
{
cin >> op;
if (op == 3)
{
cout << aint[1] << '\n';
}
else
{
cin >> i >> gsize;
if (op == 2)
update(1, n, i, i + gsize - 1, 1, 1);
else
update(1, n, i, i + gsize - 1, -1, 1);
}
// cout<<aint[1]<<'\n';
}
return 0;
}