#include <bits/stdc++.h>
using namespace std;
const int N = 2e5 + 5;
int n, m, q, w[N];
vector<int> e[N], g[N];
int dn, node, dfn[N], low[N], vis[N];
stack<int> stc;
void tarjan(int id) {
vis[id] = 1, stc.push(id);
dfn[id] = low[id] = ++dn;
for(int it : e[id]) {
if(!dfn[it]) {
tarjan(it), low[id] = min(low[id], low[it]);
if(low[it] == dfn[id]) {
g[++node].push_back(id);
g[id].push_back(node);
for(int x = 0; x != it; stc.pop()) {
g[node].push_back(x = stc.top());
g[x].push_back(node);
vis[x] = 0;
}
}
}
else if(vis[it]) low[id] = min(low[id], dfn[it]);
}
}
int fa[N], top[N], son[N], dep[N], sz[N], rev[N];
multiset<int> sonv[N];
void dfs1(int id, int ff) {
// cerr << "dfs " << id << " " << ff << endl;
fa[id] = ff, sz[id] = 1, dep[id] = dep[ff] + 1;
for(int it : g[id]) {
if(it == ff) continue;
dfs1(it, id), sz[id] += sz[it];
if(sz[son[id]] < sz[it]) son[id] = it;
if(id > n) sonv[id].insert(w[it]);
}
}
void dfs2(int id, int tp) {
top[id] = tp, dfn[id] = ++dn, rev[dn] = id;
if(son[id]) dfs2(son[id], tp);
for(int it : g[id]) if(it != fa[id] && it != son[id]) dfs2(it, it);
}
int val[N << 2];
void build(int l, int r, int x) {
if(l == r) return val[x] = w[rev[l]], void();
int m = l + r >> 1;
build(l, m, x << 1), build(m + 1, r, x << 1 | 1);
val[x] = min(val[x << 1], val[x << 1 | 1]);
}
void modify(int l, int r, int p, int x) {
if(l == r) return val[x] = w[rev[p]], void();
int m = l + r >> 1;
if(p <= m) modify(l, m, p, x << 1);
else modify(m + 1, r, p, x << 1 | 1);
val[x] = min(val[x << 1], val[x << 1 | 1]);
}
int query(int l, int r, int ql, int qr, int x) {
if(ql > qr) assert(0);
// cerr << x << endl;
if(ql <= l && r <= qr) return val[x];
int m = l + r >> 1, ans = 1e9;
if(ql <= m) ans = min(ans, query(l, m, ql, qr, x << 1));
if(m < qr) ans = min(ans, query(m + 1, r, ql, qr, x << 1 | 1));
return ans;
}
int main() {
// freopen("1.in", "r", stdin);
cin >> n >> m >> q, node = n;
for(int i = 1; i <= n; i++) cin >> w[i];
for(int i = 1; i <= m; i++) {
int a, b;
cin >> a >> b;
e[a].push_back(b), e[b].push_back(a);
}
tarjan(1), dfs1(1, 0), dn = 0, dfs2(1, 1);
for(int i = n + 1; i <= node; i++) w[i] = *sonv[i].begin();
build(1, node, 1);
for(int i = 1; i <= q; i++) {
// cerr << "i " << i << endl;
char op;
int x, y;
cin >> op >> x >> y;
if(op == 'A') {
int ans = 1e9;
while(top[x] != top[y]) {
if(dep[top[x]] < dep[top[y]]) swap(x, y);
ans = min(ans, query(1, node, dfn[top[x]], dfn[x], 1));
x = fa[top[x]];
}
if(dep[x] > dep[y]) swap(x, y);
ans = min(ans, query(1, node, dfn[x], dfn[y], 1)); // n -> node
if(x > n) ans = min(ans, w[fa[x]]);
cout << ans << "\n";
}
else {
if(x == 1) {w[1] = y, modify(1, node, dfn[1], 1); continue;}
int ff = fa[x];
sonv[ff].erase(sonv[ff].find(w[x]));
sonv[ff].insert(w[x] = y);
w[ff] = *sonv[ff].begin();
modify(1, node, dfn[ff], 1);
modify(1, node, dfn[x], 1);
}
}
return 0;
}
/*
2022/5/15
start thinking at
start coding at 20:49
finish debugging at 21:13
*/