#include <stdio.h>
#define MAX_N 100001
int rooms[4 * MAX_N]; // Segment tree
int lazy[4 * MAX_N]; // Lazy propagation array
void update(int node, int start, int end, int left, int right, int val) {
if (lazy[node] != 0) {
rooms[node] += lazy[node];
if (start != end) {
lazy[2 * node] += lazy[node];
lazy[2 * node + 1] += lazy[node];
}
lazy[node] = 0;
}
if (start > end || start > right || end < left)
return;
if (start >= left && end <= right) {
rooms[node] += val;
if (start != end) {
lazy[2 * node] += val;
lazy[2 * node + 1] += val;
}
return;
}
int mid = (start + end) / 2;
update(2 * node, start, mid, left, right, val);
update(2 * node + 1, mid + 1, end, left, right, val);
rooms[node] = rooms[2 * node] + rooms[2 * node + 1];
}
int query(int node, int start, int end, int left, int right) {
if (start > end || start > right || end < left)
return 0;
if (lazy[node] != 0) {
rooms[node] += lazy[node];
if (start != end) {
lazy[2 * node] += lazy[node];
lazy[2 * node + 1] += lazy[node];
}
lazy[node] = 0;
}
if (start >= left && end <= right)
return rooms[node];
int mid = (start + end) / 2;
int p1 = query(2 * node, start, mid, left, right);
int p2 = query(2 * node + 1, mid + 1, end, left, right);
return (p1 + p2);
}
int main() {
FILE *fin = fopen("hotel.in", "r");
FILE *fout = fopen("hotel.out", "w");
int N, P;
fscanf(fin, "%d %d", &N, &P);
for (int i = 0; i < P; i++) {
int op, start, M;
fscanf(fin, "%d", &op);
if (op == 1) {
fscanf(fin, "%d %d", &start, &M);
update(1, 1, N, start, start + M - 1, 1);
} else if (op == 2) {
fscanf(fin, "%d %d", &start, &M);
update(1, 1, N, start, start + M - 1, -1);
} else if (op == 3) {
fprintf(fout, "%d\n", query(1, 1, N, 1, N));
}
}
fclose(fin);
fclose(fout);
return 0;
}