#include <bits/stdc++.h>
using namespace std;
const int N=4e5;
struct Node {
int son[2],fa,val,sz;
}t[N];
int n,m,root[N];
void pushup (int x)
{
t[x].sz=t[t[x].son[0]].sz+t[t[x].son[1]].sz+1;
}
void rotate (int x)
{
int y=t[x].fa, z=t[y].fa,k=(t[y].son[1]==x);
t[z].son[t[z].son[1]==y]=x; t[x].fa=z;
t[y].son[k]=t[x].son[k^1]; t[t[x].son[k^1]].fa=y;
t[x].son[k^1]=y; t[y].fa=x;
pushup(y); pushup(x);
}
void splay (int x,int r)
{
while (t[x].fa!=r) {
int y=t[x].fa,z=t[y].fa;
if (z!=r) ((t[z].son[1]==y)^(t[y].son[1]==x))?rotate(x):rotate(y);
rotate(x);
}
if (r==0) root[root[x]]=root[x]=x;
}
void insert (int x,int v,int fa)
{
if (x==0) {
t[fa].son[t[fa].val<t[v].val]=v;
t[v].fa=fa;
return ;
}
insert(t[x].son[t[x].val<t[v].val],v,x);
pushup(x);
}
int find_num (int now,int x)
{
if (now==0) return -1;
if (t[t[now].son[0]].sz+1==x) return now;
if (t[t[now].son[0]].sz>=x) return find_num(t[now].son[0],x);
else return find_num(t[now].son[1],x-t[t[now].son[0]].sz-1);
}
int find (int x)
{
return (root[x]==x)?x:root[x]=find(root[x]);
}
int main()
{
scanf("%d%d",&n,&m);
for (int i=1;i<=n;i++) {
scanf("%d",&t[i].val);
t[i].sz=1;
root[i]=i;
}
for (int i=1;i<=m;i++) {
int x,y;
scanf("%d%d",&x,&y);
if (find(x)!=find(y)) {
splay(x,0);
insert(find(y),x,0);
root[x]=find(y);
splay(x,0);
}
}
scanf("%d",&m);
int flag=0;
for (int i=1;i<=m;i++) {
char f; int x,y;
f=getchar(); while (f<'A' || f>'Z') f=getchar();
scanf("%d%d",&x,&y);
if (f=='Q') {
if (flag==1) printf("\n");
if (flag==0) flag=1;
printf("%d",find_num(find(x),y));
splay(x,0);
}
else {
splay(x,0);
insert(find(y),x,0);
root[x]=find(y);
splay(x,0);
}
}
return 0;
}