#include #include using namespace std; #define For(i, a, b) for(int i = (a); i < (b); i++) #define rep(i, n) For(i, 0, n) #define rFor(i, a, b) for(int i = (a); i >= (b); i--) #define ALL(v) (v).begin(), (v).end() #define rALL(v) (v).rbegin(), (v).rend() #define SZ(v) ((int)(v).size()) using lint = long long; using ld = long double; int INF = 2000000000; lint LINF = 1000000000000000000; struct SetupIo { SetupIo() { ios::sync_with_stdio(false); cin.tie(nullptr); cout << fixed << setprecision(15); } } setupio; struct S { int mn, cnt; }; S op(S a, S b) { if (a.mn != b.mn) { return a.mn < b.mn ? a : b; } return S{a.mn, a.cnt + b.cnt}; } S e() { return {INF, 0}; } S mpg(int f, S x) { return S{x.mn + f, x.cnt}; } int cmp(int f, int g) { return f + g; } int id() { return 0; } int main() { int n, q; cin >> n >> q; atcoder::lazy_segtree seg(n - 1); rep(i, n - 1) { seg.set(i, S{0, 1}); } vector> qs; rep(i, q) { int t; cin >> t; if (t == 1) { int l, r; cin >> l >> r; l--; r--; seg.apply(l, r, 1); qs.emplace_back(l, r); } else if (t == 2) { int j; cin >> j; j--; auto [l, r] = qs[j]; seg.apply(l, r, -1); qs.emplace_back(-1, -1); } else { S sum = seg.all_prod(); cout << (sum.mn == 0 ? sum.cnt + 1 : 1) << "\n"; qs.emplace_back(-1, -1); } } }