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 sys
  read=sys.stdin.buffer.read;readline=sys.stdin.buffer.readline;input=lambda:sys.stdin.readline().rstrip()
  import bisect,string,math,time,functools,random,fractions
  from bisect import*
  from heapq import heappush,heappop,heapify
  from collections import deque,defaultdict,Counter
  from itertools import permutations,combinations,groupby
  rep=range;R=range
  def I():return int(input())
  def LI():return [int(i) for i in input().split()]
  def SLI():return sorted([int(i) for i in input().split()])
  def LI_():return [int(i)-1 for i in input().split()]
  def S_():return input()
  def IS():return input().split()
  def LS():return [i for i in input().split()]
  def NI(n):return [int(input()) for i in range(n)]
  def NI_(n):return [int(input())-1 for i in range(n)]
  def NLI(n):return [[int(i) for i in input().split()] for i in range(n)]
  def NLI_(n):return [[int(i)-1 for i in input().split()] for i in range(n)]
  def StoLI():return [ord(i)-97 for i in input()]
  def ItoS(n):return chr(n+97)
  def LtoS(ls):return ''.join([chr(i+97) for i in ls])
  def RLI(n=8,a=1,b=10):return [random.randint(a,b)for i in range(n)]
  def RI(a=1,b=10):return random.randint(a,b)
  def INP():
      N=10
      n=random.randint(2,N)
      mn=1
      mx=5
      a=[random.randint(mn,mx) for i in range(n)]
      s=[random.randint(mn,mx) for i in range(n)]
      return (n,a,s)
  def Rtest(T):
      case,err=0,0
      for i in range(T):
          inp=INP()
          a1=naive(*inp)
          a2=solve(*inp)
          if a1!=a2:
              x,y=a1
              z,w=a2
              cm=Comb(max(x,z))
              if cm.comb(x,y)==cm.comb(z,w):
                  case+=1
                  continue
              print(inp)
              print('naive',a1)
              print('solve',a2)
              err+=1
          case+=1
      print('Tested',case,'case with',err,'errors')
  def GI(V,E,ls=None,Directed=False,index=1):
      org_inp=[];g=[[] for i in range(V)]
      FromStdin=True if ls==None else False
      for i in range(E):
          if FromStdin:
              inp=LI()
              org_inp.append(inp)
          else:
              inp=ls[i]
          if len(inp)==2:a,b=inp;c=1
          else:a,b,c=inp
          if index==1:a-=1;b-=1
          aa=(a,c);bb=(b,c);g[a].append(bb)
          if not Directed:g[b].append(aa)
      return g,org_inp
  def RE(E):
      rt=[[]for i in range(len(E))]
      for i in range(len(E)):
          for nb,d in E[i]:
              rt[nb]+=(i,d),
      return rt
  def GGI(h,w,search=None,replacement_of_found='.',mp_def={'#':1,'.':0},boundary=1):
      #h,w,g,sg=GGI(h,w,search=['S','G'],replacement_of_found='.',mp_def={'#':1,'.':0},boundary=1) # sample usage
      mp=[boundary]*(w+2);found={}
      for i in R(h):
          s=input()
          for char in search:
              if char in s:
                  found[char]=((i+1)*(w+2)+s.index(char)+1)
                  mp_def[char]=mp_def[replacement_of_found]
          mp+=[boundary]+[mp_def[j] for j in s]+[boundary]
      mp+=[boundary]*(w+2)
      return h+2,w+2,mp,found
  def TI(n):return GI(n,n-1)
  def accum(ls):
      rt=[0]
      for i in ls:rt+=[rt[-1]+i]
      return rt
  def bit_combination(n,base=2):
      rt=[]
      for tb in R(base**n):s=[tb//(base**bt)%base for bt in R(n)];rt+=[s]
      return rt
  def gcd(x,y):
      if y==0:return x
      if x%y==0:return y
      while x%y!=0:x,y=y,x%y
      return y
  def YN(x):print(['NO','YES'][x])
  def Yn(x):print(['No','Yes'][x])
  def show(*inp,end='\n'):
      if show_flg:print(*inp,end=end)
  
  mo=10**9+7
  mo=998244353
  inf=float('inf')
  FourNb=[(-1,0),(1,0),(0,1),(0,-1)];EightNb=[(-1,0),(1,0),(0,1),(0,-1),(1,1),(-1,-1),(1,-1),(-1,1)];compas=dict(zip('WENS',FourNb));cursol=dict(zip('LRUD',FourNb))
  alp=[chr(ord('a')+i)for i in range(26)]
  #sys.setrecursionlimit(10**7)
  
  class UnionFind:
      def __init__(self, n):
          # 負  : 根であることを示す。絶対値はランクを示す
          # 非負: 根でないことを示す。値は親を示す
          self.table = [-1] * n
   
      def _root(self, x):
          if self.table[x] < 0:
              return x
          else:
              # 経路の圧縮
              self.table[x] = self._root(self.table[x])
              return self.table[x]
   
      def find(self, x, y):
          return self._root(x) == self._root(y)
   
      def union(self, x, y):
          r1 = self._root(x)
          r2 = self._root(y)
          if r1 == r2:
              return
          # ランクの取得
          d1 = self.table[r1]
          d2 = self.table[r2]
          if d1 <= d2:
              self.table[r2] = r1
              if d1 == d2:
                  self.table[r1] -= 1
          else:
              self.table[r1] = r2
      
      def __str__(self):
          rt=[i if j<0 else j for i,j in enumerate(self.table)]
          return str(rt)
  
  
  show_flg=False
  show_flg=True
  
  ans=0
  
  q=I()
  p=[]
  r=[]
  o=[]
  op=[]
  for _ in range(q):
      t,x,*y=LI()
      p+=(t,x,y),
  
  
  n=5*10**5+1
  c=list(range(n+1))
  uf=UnionFind(n)
  for t,x,z in p[::-1]:
      if t==2:
          y=z[0]
          uf.union(y,x)
          op+=(x,y),
          c[x]=c[y]
      else:
          r+=c[x],
          o+=x,
          op+=x,
  print(*r[::-1])