#include<bits/stdc++.h>
using namespace std;
int n,m,tot,q,Q;
int idd[1000010];
int rt[1000010];
int fa[1000010];
struct node{
int ls;
int rs;
int w;
}t[100000010];
int find(int f){
if(fa[f]==f){
return f;
}
else{
fa[f]=find(fa[f]);
return fa[f];
}
}
int Build(int l,int r,int f){
int o=++tot;
if(l==r){
t[o].w+=1;
return o;
}
int m=(l+r)/2;
if(f<=m){
t[o].ls=(l,m,f);
}
else{
t[o].rs=(m+1,r,f);
}
t[o].w=t[t[o].ls].w+t[t[o].rs].w;
return o;
}
int Update(int fv,int fu,int l,int r){
if(fv==0){
return fu;
}
if(fu==0){
return fv;
}
if(l==r){
t[fv].w+=t[fu].w;
return fv;
}
int m=(l+r)/2;
t[fv].ls=Update(t[fv].ls,t[fu].ls,l,m);
t[fv].rs=Update(t[fv].rs,t[fu].rs,m+1,r);
t[fv].w=t[t[fv].ls].w+t[t[fv].rs].w;
return fv;
}
int Query(int o,int l,int r,int v){
if(l==r){
return l;
}
int m=(l+r)/2;
int lsum=t[t[o].ls].w;
if(v<=lsum){
return Query(t[o].ls,l,m,v);
}
else{
return Query(t[o].rs,m+1,r,v-lsum);
}
}
int main(){
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++){
scanf("%d",&q);
idd[q]=i;
rt[i]=Build(1,n,q);
fa[i]=i;
}
for(int i=1;i<=m;i++){
int u,v;
scanf("%d%d",&u,&v);
int fu=find(fa[u]);
int fv=find(fa[v]);
if(fu==fv){
continue;
}
fa[fu]=fv;
rt[fv]=Update(rt[fv],rt[fu],1,n);
}
scanf("%d",&Q);
for(int i=1;i<=Q;i++){
char s[10];
scanf("%s",s);
if(s[0]=='B'){
int u,v;
scanf("%d%d",&u,&v);
int fu=find(fa[u]);
int fv=find(fa[v]);
if(fu==fv){
continue;
}
fa[fu]=fv;
rt[fv]=Update(rt[fv],rt[fu],1,n);
}
else{
int u,v;
scanf("%d%d",&u,&v);
int fu=find(u);
if(t[rt[fu]].w<v){
printf("-1\n");
}
else{
int k=Query(rt[fu],1,n,v);
printf("%d\n",idd[k]);
}
}
}
return 0;
}