RT. 萌新求调 ( ・´ω`・ )
#include <bits/stdc++.h>
using namespace std;
const int N=1e5+10;
int n,m,q,f[N],ys[N];
struct node {
int l,r,size,val,key;
} tr[N];
inline void Add(int x,int y) {
tr[x].val=y;
tr[x].size=1;
tr[x].key=rand();
tr[x].l=tr[x].r=0;
}
inline void pushup(int u) {
tr[u].size=tr[tr[u].l].size+tr[tr[u].r].size+1;
}
inline void Split(int u,int val,int &l,int &r) {
if (!u) return void(l=r=0);
if (tr[u].val<=val) {
l=u,Split(tr[u].r,val,tr[l].r,r);
} else {
r=u,Split(tr[u].l,val,l,tr[r].l);
}
pushup(u);
}
inline int Merge(int l,int r) {
if (!l||!r) return l+r;
if (tr[l].key<tr[r].key) {
tr[l].r=Merge(tr[l].r,r);
pushup(l); return l;
} else {
tr[r].l=Merge(l,tr[r].l);
pushup(r); return r;
}
}
inline int kth(int u,int k) {
if (tr[tr[u].l].size+1==k) return tr[u].val;
else if (tr[tr[u].l].size>=k) return kth(tr[u].l,k);
else return kth(tr[u].r,k-tr[tr[u].l].size-1);
}
inline int find(int x) {
if (f[x]==x) return x;
return f[x]=find(f[x]);
}
inline void dfs(int x,int y) {
if (!x) return;
dfs(tr[x].l,y); dfs(tr[x].r,y);
tr[x].l=tr[x].r=0; tr[x].size=1;
int t1,t2;
Split(y,tr[x].val,t1,t2);
y=Merge(Merge(t1,x),t2);
}
inline void merge(int x,int y) {
x=find(x),y=find(y);
if (x==y) return;
if (tr[x].size>tr[y].size) swap(x,y);
f[x]=y; dfs(x,y);
}
inline void print(int u) {
if (tr[u].l) print(tr[u].l);
cout<<tr[u].val<<" ";
if (tr[u].r) print(tr[u].r);
}
int main() {
srand(time(0)); srand(rand()); srand(rand());
ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
cin>>n>>m;
for (int i=1;i<=n;++i) {
int x; cin>>x; Add(i,x); f[i]=i; ys[x]=i;
}
for (int i=1;i<=m;++i) {
int x,y; cin>>x>>y; merge(x,y);
}
cin>>q;
for (int i=1;i<=q;++i) {
char c; int x,y; cin>>c>>x>>y;
if (c=='Q') {
int t=find(x); //print(t); cout<<endl;
cout<<(tr[t].size<y?-1:ys[kth(t,y)])<<endl;
} else merge(x,y);
}
return 0;
}