Advertisement
bibaboba12345

E educ119

Dec 18th, 2021
525
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.75 KB | None | 0 0
  1. #pragma GCC target ("avx2")
  2. #pragma GCC optimization ("O3")
  3. #pragma GCC optimization ("unroll-loops")
  4. #include <iostream>
  5. #include <queue>
  6. #include <vector>
  7. #include <algorithm>
  8. #include <cmath>
  9. #include <string>
  10.  
  11. using namespace std;
  12. const long long N = 6e5 + 7;
  13. struct dsu {
  14.  
  15. int p[N];
  16. int size[N], numb[N];
  17. int FirstNum[N];
  18. void init() {
  19. for (int i = 0; i < N; i++) {
  20. p[i] = i;
  21. size[i] = 1;
  22. numb[i] = 0;
  23. FirstNum[i] = -1;
  24. }
  25. }
  26.  
  27. int get(int a) {
  28. if (a != p[a]) {
  29. p[a] = get(p[a]);
  30. }
  31. return p[a];
  32. }
  33.  
  34. void add(int ind, int num) {
  35. numb[ind] = num;
  36. if (FirstNum[num] != -1) {
  37. merge(ind, FirstNum[num]);
  38. }
  39. else {
  40. FirstNum[num] = ind;
  41. }
  42. }
  43.  
  44. void merge(int a, int b) {
  45. int A = get(a);
  46. int B = get(b);
  47. if (A == B) {
  48. return;
  49. }
  50. if (size[A] > size[B]) {
  51. swap(A, B);
  52. }
  53. p[A] = B;
  54. size[B] += size[A];
  55. }
  56.  
  57. void merge2(int num1, int num2) {
  58. if (FirstNum[num1] == -1) {
  59. return;
  60. }
  61. if (FirstNum[num2] == -1) {
  62. FirstNum[num2] = FirstNum[num1];
  63. int A = get(FirstNum[num1]);
  64. numb[A] = num2;
  65. FirstNum[num1] = -1;
  66. return;
  67. }
  68. int A = get(FirstNum[num1]);
  69. int B = get(FirstNum[num2]);
  70. if (size[A] > size[B]) {
  71. swap(A, B);
  72. }
  73. p[A] = B;
  74. size[B] += size[A];
  75. numb[B] = num2;
  76. FirstNum[num1] = -1;
  77. }
  78. int GetNum(int ind) {
  79. int a = get(ind);
  80. return numb[a];
  81. }
  82. };
  83. dsu D;
  84. int n, x, y,q, type;
  85. int main()
  86. {
  87. cin >> q;
  88. int cnt = 0;
  89. D.init();
  90. for (int I = 0; I < q; I++) {
  91. cin >> type;
  92. if (type == 1) {
  93. cin >> x;
  94. D.add(cnt, x);
  95. cnt++;
  96. }
  97. else {
  98. cin >> x >> y;
  99. if (x != y) {
  100. D.merge2(x, y);
  101. }
  102. }
  103. }
  104. for (int i = 0; i < cnt; i++) {
  105. cout << D.GetNum(i) << " ";
  106. }
  107.  
  108. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement