1 #include<cstdio>
2 #include<cstdlib>
3 #include<cstring>
4 #include<iostream>
5 #include<algorithm>
6 using namespace std;
7 #define Maxn 1000010
8
9 struct node
10 {
11 int x,lc,rc,dis;
12 }t[Maxn];
13
14 void upd(int x)
15 {
16 t[x].lc=t[x].rc=t[x].dis=0;
17 }
18
19 int rt[Maxn],a[Maxn];
20 int rtt(int x)
21 {
22 if(rt[x]!=x) rt[x]=rtt(rt[x]);
23 return rt[x];
24 }
25
26 struct Ltree
27 {
28 int merge(int x,int y)
29 {
30 if(x==0||y==0) return x+y;
31 if(t[x].x>t[y].x) swap(x,y);
32 t[x].rc=merge(t[x].rc,y);
33 if(t[t[x].lc].dis<t[t[x].rc].dis) swap(t[x].lc,t[x].rc);
34 t[x].dis=t[t[x].rc].dis+1;
35 // rt[t[x].rc]=x;
36 return x;
37 }
38 }heap;
39
40 char s[110];
41 bool mark[Maxn];
42
43 int main()
44 {
45 int n;
46 scanf("%d",&n);
47 for(int i=1;i<=n;i++) scanf("%d",&a[i]);
48 for(int i=1;i<=n;i++) rt[i]=i,upd(i),t[i].x=a[i],mark[i]=1;
49 int m;
50 scanf("%d",&m);
51 for(int i=1;i<=m;i++)
52 {
53 scanf("%s",s);
54 if(s[0]==‘M‘)
55 {
56 int x,y;
57 scanf("%d%d",&x,&y);
58 if(!mark[x]||!mark[y]) continue;
59 if(rtt(x)==rtt(y)) continue;
60 int nw=heap.merge(rtt(x),rtt(y));
61 rt[rtt(x)]=rt[rtt(y)]=nw;
62 }
63 else
64 {
65 int x,nw;
66 scanf("%d",&x);
67 if(!mark[x]) {printf("0\n");continue;}
68 nw=rtt(x);
69 int xx=heap.merge(t[nw].lc,t[nw].rc);
70 rt[xx]=xx;rt[nw]=xx;
71 printf("%d\n",t[nw].x);
72 mark[nw]=0;
73 }
74 }
75 return 0;
76 }