fork download
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. int n, m, q;
  4. int par[100005], ans[100005];
  5. pair <int, int> edge[100005];
  6. vector <int> idx[100005];
  7.  
  8. struct ZATA {
  9. int l, r, val;
  10. };
  11.  
  12. vector <ZATA> vt[100005];
  13.  
  14. int FIND(int u) {
  15. if (par[u] == u) return u;
  16. else return par[u] = FIND(par[u]);
  17. }
  18.  
  19. void MERGE(int u, int v) {
  20. u = FIND(u);
  21. v = FIND(v);
  22. if (u == v) return;
  23. par[v] = u;
  24. }
  25.  
  26. main() {
  27. ios_base::sync_with_stdio(false);
  28. cin.tie(0); cout.tie(0);
  29. freopen("TEST.inp", "r", stdin);
  30. freopen("TEST.out", "w", stdout);
  31. cin >> n >> m >> q;
  32. for (int i = 1; i <= n; i++) {
  33. int a;
  34. cin >> a;
  35. idx[a].push_back(i);
  36. }
  37. for (int i = 1; i <= q; i++) cin >> edge[i].first >> edge[i].second;
  38.  
  39. int mid = (-1 + q + 1) / 2;
  40. for (int i = 1; i <= m; i++)
  41. vt[mid].push_back({-1, q + 1, i});
  42. int dem = 0;
  43.  
  44. while (dem < m) {
  45. for (int i = 1; i <= n; i++) par[i] = i;
  46. for (int i = 0; i <= q; i++) {
  47. if (i) MERGE(edge[i].first, edge[i].second);
  48. for (auto res : vt[i]) {
  49. bool ok = true;
  50. int root = 0;
  51. for (auto p : idx[res.val]) {
  52. if (root == 0) root = FIND(p);
  53. else if (root != FIND(p)) ok = false;
  54. }
  55. if (ok) res.r = i;
  56. else res.l = i;
  57. mid = (res.l + res.r) / 2;
  58. if (res.l == res.r - 1) {
  59. ans[res.val] = res.r;
  60. dem++;
  61. } else vt[mid].push_back(res);
  62. }
  63. vt[i].clear();
  64. }
  65. }
  66.  
  67. for (int i = 1; i <= m; i++)
  68. if (ans[i] == q + 1) cout << -1 << '\n';
  69. else cout << ans[i] << '\n';
  70.  
  71. return 0;
  72. }
  73.  
Success #stdin #stdout 0.01s 9764KB
stdin
Standard input is empty
stdout
Standard output is empty