#include <bits/stdc++.h>
using namespace std;
#define int long long
#define mpr make_pair
#define fr first
#define sc second
inline int read(){
int res=0,f=1;char c=getchar();
while (c<'0'||c>'9') {if (c=='-') f=-1;c=getchar();}
while (c>='0'&&c<='9') {res=res*10+(c-'0');c=getchar();}
return res*f;
}
const int N=6e5+5;
struct node {int to,next;} E[N];
vector<int>ans[N],e[N];
int n,nn,m,q,a[N];
int cnt,cnt2,num,h[N],Dfn[N],low[N],s[N],sd,r;
bitset<N>tmp;
inline void add(int x,int y){
E[++cnt].to=y;
E[cnt].next=h[x];
h[x]=cnt;
}
void tarjan(int u){
Dfn[u]=low[u]=++cnt2,s[++sd]=u;
if (u==r&&h[u]==0){
ans[++cnt].push_back(u);
return;
}
for (int v,i=h[u];v=E[i].to,i;i=E[i].next){
if (!Dfn[v]){
tarjan(v),low[u]=min(low[u],low[v]);
if (low[v]>=Dfn[u]){
cnt++;
int t;
do {t=s[sd--],ans[cnt].push_back(t);} while (t!=v);
ans[cnt].push_back(u);
}
}
else low[u]=min(low[u],Dfn[v]);
}
}
int dep[N],siz[N],fa[N],son[N];
int dfs(int u,int father){
dep[u]=dep[father]+1;
fa[u]=father;
siz[u]=1;
int maxn=-1;
for (auto v:e[u]){
if (v==father) continue;
int sizes=dfs(v,u);
siz[u]+=sizes;
if (sizes>maxn) maxn=sizes,son[u]=v;
}
return siz[u];
}
int minn[N],rel[N];
int dfn[N],top[N],tip=0;
void dfs2(int u,int father,int op){
if (op==1) top[u]=top[father];
dfn[u]=++tip,rel[tip]=u;
if (son[u]!=0) dfs2(son[u],u,1);
for (auto v:e[u]){
if (v==father||v==son[u]) continue;
dfs2(v,u,0);
}
}
void init(int root){
dfs(root,0);
for (int i=1;i<=n;i++) top[i]=i;
dfs2(root,0,0);
}
multiset<int>st[N];
struct sgm{
void build(int x,int l,int r){
if (l==r){
minn[x]=a[rel[l]];
return;
}
int mid=(l+r)/2;
build(x*2,l,mid);
build(x*2+1,mid+1,r);
minn[x]=min(minn[x*2],minn[x*2+1]);
}
int query(int o,int l,int r,int x,int y){
if (x<=l&&r<=y) return minn[o];
int mid=l+r>>1,ret=INT_MAX;
if (x<=mid) ret=min(ret,query(o<<1,l,mid,x,y));
if (mid<y) ret=min(ret,query(o<<1|1,mid+1,r,x,y));
return ret;
}
void update(int x,int l,int r,int L,int k){
if (l==r){
minn[x]=k;
return;
}
int mid=(l+r)/2;
if (L<=mid) update(x*2,l,mid,L,k);
else update(x*2+1,mid+1,r,L,k);
minn[x]=min(minn[x*2],minn[x*2+1]);
}
}book;
int qpm(int x,int y){
int res=1e18;
while (top[x]!=top[y]){
if (dep[top[x]]<dep[top[y]]) swap(x,y);
res=min(res,book.query(1,1,n,dfn[top[x]],dfn[x]));
x=fa[top[x]];
}
if (dep[x]>dep[y]) swap(x,y);
res=min(res,book.query(1,1,n,dfn[x],dfn[y]));
if (x>y) res=min(res,a[fa[x]]);
return res;
}
signed main(){
n=nn=read(),m=read(),q=read();
for (int i=1;i<=n;i++){
a[i]=read();
}
for (int i=1;i<=m;i++){
int x=read(),y=read();
if (x==y) continue;
add(x,y),add(y,x);
}
cnt=0;
for (int i=1;i<=n;i++)
if (Dfn[i]==0){
r=i;
tarjan(i);
}
for (int i=1;i<=cnt;i++){
for (auto j:ans[i]){
e[n+i].push_back(j);
e[j].push_back(n+i);
}
}
n+=cnt;
init(1);
for (int i=1;i<=n;i++)
if (fa[i]) st[fa[i]].insert(a[i]);
for (int i=n;i>n-cnt;i--) a[i]=*st[i].begin();
book.build(1,1,n);
while (q--){
char ch;cin>>ch;
if (ch=='C'){
int x=read(),c=read();
if (fa[x]){
int i=fa[x];
st[i].erase(st[i].lower_bound(a[x]));
st[i].insert(c);
if (a[i]==*st[i].begin()) continue;
a[i]=*st[i].begin();
book.update(1,1,n,dfn[i],a[i]);
}
a[x]=c;
book.update(1,1,n,dfn[x],c);
}
else{
int x=read(),y=read();
cout<<qpm(x,y)<<'\n';
}
}
return 0;
}