fork download
  1. #include <bits/stdc++.h>
  2.  
  3. using namespace std;
  4.  
  5. typedef long long ll;
  6. typedef pair<int, int> ii;
  7.  
  8. const int INF = 1e9;
  9. const ll LINF = 1e18;
  10.  
  11. const int N = 1e5 + 5;
  12. const int M = 1e5 + 5;
  13. const int Q = 1e5 + 5;
  14.  
  15. // Duyệt ngược truy vấn => chuyển từ thao tác xoá cạnh thành thao tác thêm cạnh
  16.  
  17. struct Edge {
  18. int u, v;
  19. };
  20.  
  21. int n, m, q;
  22. vector<Edge> edges;
  23. vector<int> queries;
  24.  
  25. int p[N], sz[N];
  26.  
  27. void initSet() {
  28. for (int u = 1; u <= n; u++) {
  29. p[u] = u;
  30. sz[u] = 1;
  31. }
  32. }
  33.  
  34. int findSet(int u) {
  35. if (p[u] == u) return u;
  36. return p[u] = findSet(p[u]);
  37. }
  38.  
  39. bool unionSet(int u, int v) {
  40. u = findSet(u);
  41. v = findSet(v);
  42. if (u == v) return false;
  43. if (sz[u] < sz[v]) swap(u, v);
  44. p[v] = u;
  45. sz[u] += sz[v];
  46. return true;
  47. }
  48.  
  49. bool marked[M];
  50. int ans[Q];
  51.  
  52. int main() {
  53. ios::sync_with_stdio(false);
  54. cin.tie(nullptr);
  55. cin >> n >> m >> q;
  56.  
  57. for (int i = 0; i < m; i++) {
  58. int u, v;
  59. cin >> u >> v;
  60. edges.push_back({u, v});
  61. }
  62.  
  63. for (int i = 0; i < q; i++) {
  64. int id; cin >> id;
  65. --id;
  66. marked[id] = true;
  67. queries.push_back(id);
  68. }
  69.  
  70. initSet();
  71.  
  72. int num_cc = n; // Số thành phần liên thông
  73. for (int i = 0; i < m; i++) {
  74. if (marked[i]) continue;
  75. Edge e = edges[i];
  76. num_cc -= unionSet(e.u, e.v);
  77. }
  78.  
  79. for (int i = q - 1; i >= 0; i--) {
  80. ans[i] = num_cc;
  81. int id = queries[i];
  82. Edge e = edges[id];
  83. num_cc -= unionSet(e.u, e.v);
  84. }
  85.  
  86. for (int i = 0; i < q; i++) cout << ans[i] << '\n';
  87. }
Success #stdin #stdout 0.01s 5284KB
stdin
4 4 3
1 2
2 3
1 3
3 4
2
4
3
stdout
1
2
3