#include <bits/stdc++.h>
using namespace std;
const int maxn = 30000005;
int tree[maxn],lc[maxn],rc[maxn],tot,sum[maxn];
void push_up( int x ){
tree[x] = max( tree[ lc[x] ],tree[rc[x] ] );
sum[x] = sum[ lc[x] ] + sum[ rc[x] ];
}
void update( int left,int right,int v,int l,int r,int x ){
if( left <= l && right >= r ){
tree[x] = v;sum[x] = 1;
return;
}
int mid = l+r>>1;
if( left <= mid ) {
if( !lc[x] ) lc[x] = ++tot;
update( left,right,v,l,mid,lc[x] );
}
if( right > mid ){
if( !rc[x] ) rc[x] = ++tot;
update( left,right,v,mid+1,r,rc[x] );
}
push_up(x);
}
int merge( int l,int r,int x,int y ){
if( !x ) return y;
if( !y ) return x;
if( l == r ){
sum[x] += sum[y];
tree[x] = max( tree[x],tree[y] );
return x;
}
int mid = l+r>>1;
lc[x] = merge( l,mid,lc[x],lc[y] );
rc[x] = merge( mid+1,r,rc[x],rc[y] );
push_up(x);
return x;
}
int query( int k,int l,int r,int x ){
if( k > sum[x] ){
return -1;
}
if( l == r ){
return tree[x];
}
int mid =l+r>>1;
if( sum[ lc[x] ] >= k ){
return query( k,l,mid,lc[x] );
}else{
k -= sum[ lc[x] ];
return query( k,mid+1,r,rc[x] );
}
}
int fa[maxn];
void init(int n){
for( int i = 1;i <= n;i++ ) fa[i] = i;
}
int get( int x ){
if( x == fa[x] ) return x;
return fa[x] = get( fa[x] );
}
int val[maxn];
int main(){
int n,m,x,y,k;
scanf("%d%d",&n,&m);
tot = n;
for( int i = 1;i <= n;i++ ){
scanf("%d",&val[i]);
update( val[i],val[i],i,1,n,i );
}
init(n);
for( int i = 0;i < m;i++ ){
scanf("%d%d",&x,&y);
x = get(x),y = get(y);
if( x != y ){
fa[y] = x;
merge( 1,n,x,y );
}
}
int q;scanf("%d",&q);
char str[10];
for( int i = 0;i < q;i++ ){
scanf("%s",str);
if( str[0]=='Q' ){
scanf("%d%d",&x,&k);
x = get(x);
int id;
id = query(k, 1, n, x);
printf("%d\n", id);
}else{
scanf("%d%d",&x,&y);
x = get(x),y = get(y);
if( x != y ){
fa[y] = x;
merge( 1,n,x,y );
}
}
}
return 0;
}