Advertisement
Dzham

Untitled

Apr 28th, 2019
120
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.80 KB | None | 0 0
  1. #include <iostream>
  2. #include <vector>
  3. #include <algorithm>
  4. #include <set>
  5.  
  6. class DSU {
  7. std::vector<int> dsu;
  8. std::vector<int> sizes;
  9. std::vector<int> smallest;
  10. int result = 0;
  11. bool updated = true;
  12. std::set<int> even;
  13. std::set<int> odd;
  14.  
  15. public:
  16. DSU(int n) {
  17. for (int i = 0; i < n; ++i) {
  18. dsu.push_back(i);
  19. smallest.push_back(i);
  20. odd.insert(i);
  21. }
  22. sizes.resize(n, 1);
  23. }
  24.  
  25. int find_root(int a) {
  26. if (dsu[a] == a) {
  27. return a;
  28. }
  29. return dsu[a] = find_root(dsu[a]);
  30. }
  31.  
  32. void union_dsu(int a, int b) {
  33. a = find_root(a);
  34. b = find_root(b);
  35. if (a != b) {
  36. updated = false;
  37. if (sizes[b] < sizes[a]) {
  38. dsu[b] = a;
  39. if (sizes[b] % 2 == 1) {
  40. odd.erase(b);
  41. if (sizes[a] % 2 == 0) {
  42. even.erase(a);
  43. odd.insert(a);
  44. } else {
  45. odd.erase(a);
  46. even.insert(a);
  47. }
  48. } else {
  49. even.erase(b);
  50. }
  51. sizes[a] += sizes[b];
  52. smallest[a] = std::min(smallest[a], smallest[b]);
  53. } else {
  54. dsu[a] = b;
  55. if (sizes[a] % 2 == 1) {
  56. odd.erase(a);
  57. if (sizes[b] % 2 == 0) {
  58. even.erase(b);
  59. odd.insert(b);
  60. } else {
  61. odd.erase(b);
  62. even.insert(b);
  63. }
  64. } else {
  65. even.erase(a);
  66. }
  67. sizes[b] += sizes[a];
  68. smallest[b] = std::min(smallest[a], smallest[b]);
  69. }
  70. }
  71. }
  72.  
  73. int city() {
  74. if (updated) {
  75. if (result == -1) {
  76. return -1;
  77. }
  78. return result + 1;
  79. }
  80. int res = dsu.size();
  81. for (auto i : odd) {
  82. if (smallest[i] < res) {
  83. res = smallest[i];
  84. }
  85. }
  86. updated = true;
  87. if (res == dsu.size()) {
  88. result = -1;
  89. return -1;
  90. } else {
  91. result = res;
  92. return result + 1;
  93. }
  94. }
  95. };
  96.  
  97. int main() {
  98. int n, m;
  99. std::cin >> n >> m;
  100. DSU dsu(n);
  101. char command;
  102. int a, b;
  103. for (int i = 0; i < m; ++i) {
  104. std::cin >> command;
  105. if (command == 'a') {
  106. std::cin >> a >> b;
  107. dsu.union_dsu(a - 1, b - 1);
  108. } else {
  109. std::cout << dsu.city() << '\n';
  110. }
  111. }
  112. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement