#pragma GCC optimize(2)
#pragma GCC optimize("Ofast")
#pragma GCC optimize("inline")
#include<bits/stdc++.h>
#define MAXN 200005
#define LL long long
#define inf 9187201950435737471
#define int long long
using namespace std;
inline LL read(){
LL res=0,fl=1;
char ch=getchar();
while(!(ch>='0' && ch<='9')){if(ch=='-')fl=-1;ch=getchar();}
while(ch>='0' && ch<='9')res=res*10+ch-'0',ch=getchar();
return res*fl;
}
inline LL max(LL a,LL b){return a>b?a:b;}
inline LL min(LL a,LL b){return a<b?a:b;}
inline void swap(int &a,int &b){int c;c=a;a=b;b=c;}
int n,m,q,tot,cnt=0,tp=0,idt=0,rt;
int a[MAXN],dfn[MAXN],low[MAXN],st[MAXN];
int si[MAXN],fa[MAXN],dep[MAXN],son[MAXN],id[MAXN],w[MAXN],top[MAXN];
vector<int> e[MAXN],ne[MAXN];
multiset<int> s[MAXN];
#define IT multiset<int>::iterator
struct Segment_Tree{
int l,r,val;
#define ls (k<<1)
#define rs (k<<1|1)
#define l(k) tr[k].l
#define r(k) tr[k].r
#define val(k) tr[k].val
#define mid(k) ((tr[k].l+tr[k].r)>>1)
}tr[MAXN<<2];
inline void pushup(int k){
val(k)=min(val(ls),val(rs));
}
inline void build(int k,int l,int r){
l(k)=l,r(k)=r;
if(l==r){
val(k)=a[w[l]];
return;
}
build(ls,l,mid(k));
build(rs,mid(k)+1,r);
pushup(k);
}
inline void update(int k,int x,int z){
if(l(k)==r(k)){
val(k)=z;
return;
}
if(x<=mid(k))update(ls,x,z);
else update(rs,x,z);
pushup(k);
}
inline int query(int k,int l,int r){
if(l(k)>=l && r(k)<=r)
return val(k);
int res=inf;
if(l<=mid(k))res=min(res,query(ls,l,r));
if(r>mid(k))res=min(res,query(rs,l,r));
return res;
}
inline void Tarjan(int x){
dfn[x]=low[x]=++cnt;
st[++tp]=x;
for(int i=0;i<e[x].size();i++){
int y=e[x][i];
if(!dfn[y]){
Tarjan(y);
low[x]=min(low[x],low[y]);
if(low[y]>=dfn[x]){
int z;
tot++;
ne[x].push_back(tot);
ne[tot].push_back(x);
while(z=st[tp--]){
ne[z].push_back(tot);
ne[tot].push_back(z);
if(z==y)break;
}
}
}
else low[x]=min(low[x],dfn[y]);
}
}
inline void dfs_son(int x,int f,int d){
si[x]=1;
fa[x]=f;
dep[x]=d;
int maxson=0;
for(int i=0;i<ne[x].size();i++){
int y=ne[x][i];
if(y!=f){
dfs_son(y,x,d+1);
if(si[y]>maxson)maxson=si[y],son[x]=y;
}
}
}
inline void dfs_chain(int x,int topf){
id[x]=++idt;
w[idt]=x;
top[x]=topf;
if(!son[x])return;
dfs_chain(son[x],topf);
for(int i=0;i<ne[x].size();i++){
int y=ne[x][i];
if(y!=fa[x] && y!=son[x])
dfs_chain(y,y);
}
}
inline int range_query(int x,int y){
int res=inf;
while(top[x]!=top[y]){
if(dep[top[x]]<dep[top[y]])swap(x,y);
res=min(res,query(1,id[top[x]],id[x]));
x=fa[top[x]];
}
if(dep[x]>dep[y])swap(x,y);
res=min(res,query(1,id[x],id[y]));
rt=x;
return res;
}
signed main() {
char opt;
int x,y,res;
tot=n=read(),m=read(),q=read();
for(int i=1;i<=n;i++)a[i]=read();
for(int i=1;i<=m;i++){
x=read(),y=read();
e[x].push_back(y);
e[y].push_back(x);
}
for(int i=1;i<=n;i++)
if(!dfn[i])Tarjan(i);
dfs_son(1,1,1);
dfs_chain(1,1);
for(int i=2;i<=n;i++)
s[fa[i]].insert(a[i]);
for(int i=n+1;i<=tot;i++)
a[i]=s[i].empty()?inf:*s[i].begin();
build(1,1,tot);
for(int i=1;i<=q;i++){
cin>>opt;
x=read(),y=read();
if(opt=='C'){
if(x==1){
a[x]=y;
update(1,id[x],y);
continue;
}
update(1,id[x],y);
IT it=s[fa[x]].lower_bound(a[x]);
s[fa[x]].erase(it);
s[fa[x]].insert(y);
a[x]=y;
a[fa[x]]=*s[fa[x]].begin();
update(1,id[fa[x]],a[fa[x]]);
}
else {
res=inf;
res=min(res,range_query(x,y));
if(rt>n)res=min(res,a[fa[rt]]);
cout<<res<<'\n';
}
}
return 0;
}