boolcmp(int a,int b) { if (v(a)!=v(b)) returnv(a)<v(b); return a<b; }
intmerge(int a,int b) { if (!a) return b; if (!b) return a; if (cmp(b,a)) swap(a,b); r(a)=merge(r(a),b); if (d(r(a))>d(l(a))) swap(r(a),l(a)); d(a)=d(r(a))+1; return a; }
intfind(int x) { if (p(x)!=x) p(x)=find(p(x)); returnp(x); }
intmain() { int n; scanf("%d",&n); v(0)=INF; while (n--) { int t,x,y; scanf("%d %d",&t,&x); if (t==1) { v(++idx)=x; d(idx)=1; p(idx)=idx; } elseif (t==2) { scanf("%d",&y); x=find(x);y=find(y); if (x!=y) { if (cmp(y,x)) swap(x,y); p(y)=x; merge(x,y); } } elseif (t==3) { printf("%d\n",v(find(x))); } elseif (t==4) { x=find(x); if (cmp(r(x),l(x))) swap(l(x),r(x)); p(x)=l(x),p(l(x))=l(x); merge(l(x),r(x)); } } return0; }
boolcmp(int a,int b) { if (v(a)!=v(b)) returnv(a)<v(b); return a<b; }
intmerge(int a,int b) { if (!a) return b; if (!b) return a; if (cmp(b,a)) swap(a,b); r(a)=merge(r(a),b); if (d(r(a))>d(l(a))) swap(r(a),l(a)); d(a)=d(r(a))+1; return a; }
intfind(int x) { if (p(x)!=x) p(x)=find(p(x)); returnp(x); }
intmain() { int n,m; scanf("%d %d",&n,&m); for (int i=0,x;i<n;++i) { scanf("%d",&x); v(++idx)=x; d(idx)=1; p(idx)=idx; } v(0)=INF; while (m--) { int t,x,y; scanf("%d %d",&t,&x); if (t==1) { scanf("%d",&y); if (x!=y&&v(x)!=INF&&v(y)!=INF) { x=find(x);y=find(y); if (cmp(y,x)) swap(x,y); p(y)=x; merge(x,y); } } elseif (t==2) { if (v(x)==INF) { puts("-1"); continue; } printf("%d\n",v(find(x))); x=find(x); v(x)=INF; if (cmp(r(x),l(x))) swap(l(x),r(x)); p(x)=l(x),p(l(x))=l(x); merge(l(x),r(x)); } } return0; }