1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58
| int n, q; cin >> n >> q; const int p = 1, L = 0, R = q; map<array<int, 2>, int> mp[2]; vector<array<int, 4>> que[2]; for (int i = 0; i < q; i++) { char op; int u, v; cin >> op >> u >> v; u--, v--; if (u > v) swap(u, v); op -= 'A'; if (mp[op].count({ u, v })) { que[op].push_back({ mp[op][{ u, v }], i, u, v }); mp[op].erase({ u, v }); } else { mp[op][{ u, v }] = i; } } for (int op = 0; op < 2; op++) { for (auto [k, _] : mp[op]) { auto [u, v] = k; que[op].push_back({ mp[op][{ u, v }], q, u, v }); } } vector<vector<array<int, 2>>> edge((R - L) << 2); DisjointSets dsu(n); vector<int> ans(R - L); auto solve = [&](this auto&& solve, int p, int L, int R, int op) -> void { int now = dsu.now(); for (auto& [u, v] : edge[p]) { dsu.uno(u, v); } if (leaf) ans[L] += op * dsu.now(); else solve(lson, op), solve(rson, op); return dsu.undo(now); }; for (auto& [l, r, u, v] : que[0]) { auto add = [&](this auto&& add, int p, int L, int R) { if (l <= L && R <= r) return edge[p].push_back({ u, v }); if (l < mid) add(lson); if (mid < r) add(rson); }; add(curr); } solve(curr, -1); for (auto& [l, r, u, v] : que[1]) { auto add = [&](this auto&& add, int p, int L, int R) { if (l <= L && R <= r) return edge[p].push_back({ u, v }); if (l < mid) add(lson); if (mid < r) add(rson); }; add(curr); } solve(curr, 1); for (int i = 0; i < q; i++) { cout << (ans[i]) << endl; }
|