Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #pragma GCC target ("avx2")
- #pragma GCC optimization ("O3")
- #pragma GCC optimization ("unroll-loops")
- #include <iostream>
- #include <queue>
- #include <vector>
- #include <algorithm>
- #include <cmath>
- #include <string>
- using namespace std;
- const long long N = 6e5 + 7;
- struct dsu {
- int p[N];
- int size[N], numb[N];
- int FirstNum[N];
- void init() {
- for (int i = 0; i < N; i++) {
- p[i] = i;
- size[i] = 1;
- numb[i] = 0;
- FirstNum[i] = -1;
- }
- }
- int get(int a) {
- if (a != p[a]) {
- p[a] = get(p[a]);
- }
- return p[a];
- }
- void add(int ind, int num) {
- numb[ind] = num;
- if (FirstNum[num] != -1) {
- merge(ind, FirstNum[num]);
- }
- else {
- FirstNum[num] = ind;
- }
- }
- void merge(int a, int b) {
- int A = get(a);
- int B = get(b);
- if (A == B) {
- return;
- }
- if (size[A] > size[B]) {
- swap(A, B);
- }
- p[A] = B;
- size[B] += size[A];
- }
- void merge2(int num1, int num2) {
- if (FirstNum[num1] == -1) {
- return;
- }
- if (FirstNum[num2] == -1) {
- FirstNum[num2] = FirstNum[num1];
- int A = get(FirstNum[num1]);
- numb[A] = num2;
- FirstNum[num1] = -1;
- return;
- }
- int A = get(FirstNum[num1]);
- int B = get(FirstNum[num2]);
- if (size[A] > size[B]) {
- swap(A, B);
- }
- p[A] = B;
- size[B] += size[A];
- numb[B] = num2;
- FirstNum[num1] = -1;
- }
- int GetNum(int ind) {
- int a = get(ind);
- return numb[a];
- }
- };
- dsu D;
- int n, x, y,q, type;
- int main()
- {
- cin >> q;
- int cnt = 0;
- D.init();
- for (int I = 0; I < q; I++) {
- cin >> type;
- if (type == 1) {
- cin >> x;
- D.add(cnt, x);
- cnt++;
- }
- else {
- cin >> x >> y;
- if (x != y) {
- D.merge2(x, y);
- }
- }
- }
- for (int i = 0; i < cnt; i++) {
- cout << D.GetNum(i) << " ";
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement