#include<bits/stdc++.h>
using namespace std;
const int nn=1000010;
int rt[nn], idd[nn], tot,f[nn];
struct node
{
int ls, rs, v, w;
}t[30*nn];
int find(int x)
{
if(rt[x]==x)return x;
rt[x]=find(rt[x]);
return rt[x];
}
int build(int l, int r, int x)
{
int o=++tot;
if(l==r)
{
t[o].w=1;
return o;
}
int mid=(l+r)/2;
if(x<=mid)
{
t[o].ls=build(l,mid,x);
}
else
{
t[o].rs=build(mid+1,r,x);
}
t[o].w=t[t[o].ls].w+t[t[o].rs].w;
return o;
}
int update(int fu, int fv, int l, int r)
{
if(fu==0)
{
return fv;
}
if(fv==0)
{
return fu;
}
if(l==r)
{
t[fu].w+=t[fv].w;
return fu;
}
int mid=(l+r)/2;
t[fu].ls=update(t[fu].ls,t[fv].ls,l,mid);
t[fu].rs=update(t[fu].rs,t[fv].rs,mid+1,r);
t[fu].w=t[t[fu].ls].w+t[t[fu].rs].w;
return fu;
}
int query(int fu, int l, int r, int k)
{
if(l==r)
{
return l;
}
int mid=(l+r)/2;
int s=t[t[fu].ls].w;
if(k<=s)
{
return query(t[fu].ls,l,mid,k);
}
else
{
return query(t[fu].rs,mid+1,r,s);
}
}
int main()
{
int n, m;
cin>>n>>m;
for(int i=1;i<=n;i++)
{
cin>>rt[i];
}
build(1,n,1);
for(int i=1;i<=m;i++)
{
int u, v;
cin>>u>>v;
int fu=find(u);
int fv=find(v);
if(fu==fv)
{
continue;
}
f[fv]=fu;
rt[fu]=update(rt[fu],rt[fv],1,n);
}
int q;
cin>>q;
for(int i=1;i<=q;i++)
{
char s[10];
int u, v;
cin>>s>>u>>v;
if(s[0]=='B')
{
int fu=find(u);
int fv=find(v);
if(fu==fv)
{
continue;
}
f[fv]=fu;
rt[fu]=update(rt[fu],rt[fv],1,n);
}
else
{
int fu=find(u);
if(t[rt[fu]].w<v)
{
cout<<"-1"<<endl;
}
else
{
int k=query(rt[fu],1,n,v);
cout<<idd[k]<<endl;
}
}
}
return 0;
}