#include "atcoder/segtree.hpp" #pragma GCC target("avx2") #pragma GCC optimize("O3") #pragma GCC optimize("unroll-loops") #include #include using namespace std; using namespace atcoder; using ll = long long; using pll = pair; using pii = pair; using mint = modint998244353; constexpr ll mod = 998244353; using MINT = modint1000000007; constexpr ll MOD = 1000000007; int dx[4] = {1, 0, -1, 0}; int dy[4] = {0, 1, 0, -1}; template void print(vector A); int main() { ios::sync_with_stdio(false); std::cin.tie(nullptr); int N; cin >> N; int Q; cin >> Q; ll sum = 0; map queries; int block_size = 316; vector Paper(N); vector block_covered(N); vector block_ans(N); for (int i = 0; i < N; i++) { block_ans[i/block_size]++; } for (int i = 0; i < Q; i++) { int t; cin >> t; if (t == 1) { int l, r; cin >> l >> r; l--; r--; queries[i]=make_pair(l,r); int lb = l / block_size, rb = r / block_size; if (lb == rb) { for (int j = l; j < r; j++) { if (Paper[j] == 0) { block_ans[lb]--; } Paper[j]++; } continue; } for (int j = l; j < (lb + 1) * block_size; j++) { if (Paper[j] == 0) { block_ans[lb]--; } Paper[j]++; } for (int j = rb * block_size; j < r; j++) { if (Paper[j] == 0) { block_ans[rb]--; } Paper[j]++; } for (int b = lb + 1; b < rb; b++) { block_covered[b]++; } } else if (t == 2) { int q; cin >> q; q--; auto [l, r] = queries[q]; int lb = l / block_size, rb = r / block_size; if (lb == rb) { for (int j = l; j < r; j++) { if (Paper[j] == 1) { block_ans[lb]++; } Paper[j]--; } continue; } for (int j = l; j < (lb + 1) * block_size; j++) { if (Paper[j] == 1) { block_ans[lb]++; } Paper[j]--; } for (int j = rb * block_size; j < r; j++) { if (Paper[j] == 1) { block_ans[rb]++; } Paper[j]--; } for (int b = lb + 1; b < rb; b++) { block_covered[b]--; } } else { int ans=0; for (int b = 0; b <= N; b++) { if (b * block_size > N) { break; } if (block_covered[b]) { continue; } ans+=block_ans[b]; } cout< void print(vector A) { for (int i = 0; i < A.size() - 1; i++) { cout << A[i] << ' '; } cout << A[A.size() - 1] << endl; return; }