#include #define SIZE 250 #define NUM 400 int main() { int i, N, Q; scanf("%d", &N); scanf("%d", &Q); int bn, bl[NUM], br[NUM]; for (bn = 0, i = 0; 1; i = br[bn++]) { bl[bn] = i; br[bn] = i + SIZE; if (br[bn] >= N) { br[bn] = N; break; } } br[++bn] = N + 1; int h, k, ans = N, A[1000001] = {}, block[NUM][2], t, L[1000001], R[1000001], l, r, q; for (k = 0; k < bn; k++) { block[k][0] = 0; block[k][1] = br[k] - bl[k]; } for (h = 1; h <= Q; h++) { scanf("%d", &t); if (t == 1) { scanf("%d %d", &l, &r); L[h] = l; R[h] = r; k = l / SIZE; for (i = l; i < br[k] && i < r; i++) { if (A[i] == 0) { block[k][1]--; if (block[k][0] == 0) ans--; } A[i]++; } if (i < r) { for (k++; br[k] <= r; i = br[k++]) { if (block[k][0] == 0) ans -= block[k][1]; block[k][0]++; } if (i < r) { for (; i < r; i++) { if (A[i] == 0) { block[k][1]--; if (block[k][0] == 0) ans--; } A[i]++; } } } } else if (t == 2) { scanf("%d", &q); l = L[q]; r = R[q]; k = l / SIZE; for (i = l; i < br[k] && i < r; i++) { A[i]--; if (A[i] == 0) { block[k][1]++; if (block[k][0] == 0) ans++; } } if (i < r) { for (k++; br[k] <= r; i = br[k++]) { block[k][0]--; if (block[k][0] == 0) ans += block[k][1]; } if (i < r) { for (; i < r; i++) { A[i]--; if (A[i] == 0) { block[k][1]++; if (block[k][0] == 0) ans++; } } } } } else { printf("%d\n", ans); } } fflush(stdout); return 0; }