description: You have an array of integers (initially empty).
  
  You have to perform q queries. Each query is of one of two types: 
  
    * "1 x" — add the element x to the end of the array; 
    * "2 x y" — replace all occurrences of x in the array with y. 
  
  
  
  Find the resulting array after performing all the queries.
  
  Input
  
  The first line contains a single integer q (1 ≤ q ≤ 5 ⋅ 10^5) — the number of queries.
  
  Next q lines contain queries (one per line). Each query is of one of two types: 
  
    * "1 x" (1 ≤ x ≤ 5 ⋅ 10^5); 
    * "2 x y" (1 ≤ x, y ≤ 5 ⋅ 10^5). 
  
  
  
  It's guaranteed that there is at least one query of the first type.
  
  Output
  
  In a single line, print k integers — the resulting array after performing all the queries, where k is the number of queries of the first type.
  
  Examples
  
  Input
  
  
  7
  1 3
  1 1
  2 1 2
  1 2
  1 1
  1 2
  2 1 3
  
  
  Output
  
  
  3 2 2 3 2 
  
  Input
  
  
  4
  1 1
  1 2
  1 1
  2 2 2
  
  
  Output
  
  
  1 2 1 
  
  Input
  
  
  8
  2 1 4
  1 1
  1 4
  1 2
  2 2 4
  2 4 3
  1 2
  2 2 7
  
  
  Output
  
  
  1 3 3 7 
  
  Note
  
  In the first example, the array changes as follows:
  
  [] → [3] → [3, 1] → [3, 2] → [3, 2, 2] → [3, 2, 2, 1] → [3, 2, 2, 1, 2] → [3, 2, 2, 3, 2].
  
  In the second example, the array changes as follows:
  
  [] → [1] → [1, 2] → [1, 2, 1] → [1, 2, 1].
  
  In the third example, the array changes as follows:
  
  [] → [] → [1] → [1, 4] → [1, 4, 2] → [1, 4, 4] → [1, 3, 3] → [1, 3, 3, 2] → [1, 3, 3, 7].
solution: import java.io.Closeable;
  import java.io.DataInputStream;
  import java.io.FileInputStream;
  import java.io.IOException;
  import java.util.*;
  import java.util.stream.Collectors;
  
  public class E {
      public static void main(String[] args) throws IOException {
          FastScanner scanner = new FastScanner();
          HashMap<Integer, ArrayList<Integer>> value2Indices = new HashMap<>();
          int t = scanner.nextInt();
          int ptr = 0;
          while (t-- > 0) {
              int type = scanner.nextInt();
              if (type == 1) {
                  int x = scanner.nextInt();
                  value2Indices.computeIfAbsent(x, i -> new ArrayList<>()).add(ptr);
                  ptr++;
              } else {
                  int x = scanner.nextInt();
                  int y = scanner.nextInt();
                  if (x != y && value2Indices.containsKey(x)) {
                      if (value2Indices.containsKey(y)) {
                          ArrayList<Integer> listX = value2Indices.get(x);
                          ArrayList<Integer> listY = value2Indices.get(y);
                          if (listX.size() > listY.size()) {
                              listX.addAll(listY);
                              value2Indices.put(y, value2Indices.remove(x));
                          } else {
                              listY.addAll(listX);
                              listX.clear();
                          }
                      } else {
                          value2Indices.put(y, value2Indices.remove(x));
                      }
                  }
              }
          }
          int[] ans = new int[ptr];
          value2Indices.forEach((v, arr) -> arr.forEach(i -> ans[i] = v));
          System.out.println(Arrays.stream(ans).mapToObj(Integer::toString).collect(Collectors.joining(" ")));
      }
  
      /**
       * Credits: https://www.geeksforgeeks.org/fast-io-in-java-in-competitive-programming/
       */
      private static class FastScanner implements Closeable {
          final private int BUFFER_SIZE = 1 << 16;
          private DataInputStream din;
          private byte[] buffer;
          private int bufferPointer, bytesRead;
  
          public FastScanner() {
              din = new DataInputStream(System.in);
              buffer = new byte[BUFFER_SIZE];
              bufferPointer = bytesRead = 0;
          }
  
          public FastScanner(String file_name) throws IOException {
              din = new DataInputStream(new FileInputStream(file_name));
              buffer = new byte[BUFFER_SIZE];
              bufferPointer = bytesRead = 0;
          }
  
          public String readLine() throws IOException {
              byte[] buf = new byte[64];
              int cnt = 0, c;
              while ((c = read()) != -1) {
                  if (c == '\n' || c == '\r') {
                      if (cnt != 0) {
                          break;
                      } else {
                          continue;
                      }
                  }
                  buf[cnt++] = (byte) c;
              }
              return new String(buf, 0, cnt);
          }
  
          public String next() throws IOException {
              return next(32);
          }
  
          public String next(int len) throws IOException {
              byte[] buf = new byte[len];
              int ptr = 0;
              byte c = read();
              while (c <= ' ') c = read();
              do {
                  if (ptr == buf.length) {
                      buf = Arrays.copyOf(buf, buf.length << 1);
                  }
                  buf[ptr++] = c;
              } while ((c = read()) > ' ');
              if (buf.length == ptr) return new String(buf);
              return new String(Arrays.copyOf(buf, ptr));
          }
  
          public int nextInt() throws IOException {
              int ret = 0;
              byte c = read();
              while (c <= ' ') c = read();
              boolean neg = (c == '-');
              if (neg) c = read();
              do {
                  ret = ret * 10 + c - '0';
              } while ((c = read()) >= '0' && c <= '9');
              if (neg) return -ret;
              return ret;
          }
  
          public long nextLong() throws IOException {
              long ret = 0;
              byte c = read();
              while (c <= ' ') c = read();
              boolean neg = (c == '-');
              if (neg) c = read();
              do {
                  ret = ret * 10 + c - '0';
              } while ((c = read()) >= '0' && c <= '9');
              if (neg) return -ret;
              return ret;
          }
  
          public double nextDouble() throws IOException {
              double ret = 0, div = 1;
              byte c = read();
              while (c <= ' ') c = read();
              boolean neg = (c == '-');
              if (neg) c = read();
              do {
                  ret = ret * 10 + c - '0';
              } while ((c = read()) >= '0' && c <= '9');
              if (c == '.') {
                  while ((c = read()) >= '0' && c <= '9') {
                      ret += (c - '0') / (div *= 10);
                  }
              }
              if (neg) return -ret;
              return ret;
          }
  
          private void fillBuffer() throws IOException {
              bytesRead = din.read(buffer, bufferPointer = 0, BUFFER_SIZE);
              if (bytesRead == -1) buffer[0] = -1;
          }
  
          private byte read() throws IOException {
              if (bufferPointer == bytesRead) fillBuffer();
              return buffer[bufferPointer++];
          }
  
          @Override
          public void close() throws IOException {
              if (din == null) return;
              din.close();
          }
      }
  }
  