rt,第一个样例全输0,第二个样例直接RE
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=5e5+10;
const ll inf=0x3f3f3f3f3f3f3f3f;
ll n,m,q,w[N];
ll dfn[N],low[N],ins=0;
ll st[N],top=0;
bool vis[N];
ll tot=0;
multiset<pair<ll,ll> > p[N];
vector<ll> g[N];
ll father[N],deep[N],Size[N],son[N];
ll id[N],rev[N],jump[N],t=0;
ll s[N*2];
ll head[N],cnt=0;
struct node{
ll v,nex;
}e[N];
void add(ll u,ll v){
e[++cnt].v=v;
e[cnt].nex=head[u];
head[u]=cnt;
}
void tarjan(ll u){
dfn[u]=low[u]=++ins;
st[++top]=u;
vis[u]=1;
for(int i=head[u];i;i=e[i].nex){
ll v=e[i].v;
if(!dfn[v]){
tarjan(v);
low[u]=min(low[u],low[v]);
if(dfn[u]==low[v]){
tot++;
ll z=0;
do{
z=st[top--];
vis[z]=0;
g[tot].push_back(z);
g[z].push_back(tot);
}while(z!=v);
g[tot].push_back(u);
g[u].push_back(tot);
}
}
else if(vis[v]) low[u]=min(low[u],dfn[v]);
}
}
void dfs1(ll u,ll fa){
father[u]=fa;
deep[u]=deep[fa]+1;
Size[u]=1;
if(u<=n) p[u].insert({w[u],u});
for(ll v:g[u]){
if(v==fa) continue;
dfs1(v,u);
if(u>n) p[u].insert({w[v],v});
Size[u]+=Size[v];
if(Size[v]>Size[son[u]]) son[u]=v;
}
}
void dfs2(ll u,ll fa){
if(son[u]){
ll v=son[u];
jump[v]=jump[u];
id[v]=++t;
rev[t]=v;
dfs2(v,u);
}
for(ll v:g[u]){
if(v==fa) continue;
if(!jump[v]){
jump[v]=v;
id[v]=++t;
rev[t]=v;
dfs2(v,u);
}
}
}
void pushup(ll k){
s[k]=min(s[k*2],s[k*2+1]);
}
void build(ll k,ll l,ll r){
if(l==r){
s[k]=(*p[rev[l]].begin()).first;
return;
}
ll mid=(l+r)>>1;
build(k*2,l,mid);
build(k*2+1,mid+1,r);
pushup(k);
}
void change(ll k,ll l,ll r,ll x){
if(l==r){
s[k]=(*p[rev[x]].begin()).first;
return;
}
ll mid=(l+r)>>1;
if(x<=mid) change(k*2,l,mid,x);
else change(k*2+1,mid+1,r,x);
pushup(k);
}
ll ask(ll k,ll l,ll r,ll x,ll y){
if(x<=l&&r<=y){
return s[k];
}
ll mid=(l+r)>>1,tmp=inf;
if(x<=mid) tmp=min(tmp,ask(k*2,l,mid,x,y));
if(y>mid) tmp=min(tmp,ask(k*2+1,mid+1,r,x,y));
return tmp;
}
ll get(ll u,ll v){
ll tmp=inf;
while(jump[u]!=jump[v]){
if(deep[jump[u]]<deep[jump[v]]) swap(u,v);
tmp=min(tmp,ask(1,1,tot,id[jump[u]],id[u]));
u=father[jump[u]];
}
if(deep[u]<deep[v]) swap(u,v);
tmp=min(tmp,ask(1,1,tot,id[v],id[u]));
if(v>n) tmp=min(tmp,w[father[v]]);
return tmp;
}
int main(){
cin>>n>>m>>q;
for(int i=1;i<=n;i++) cin>>w[i];
for(int i=1;i<=m;i++){
ll u,v;
cin>>u>>v;
add(u,v);
add(v,u);
}
tot=n;
for(int i=1;i<=n;i++){
if(!dfn[i]){
tarjan(i);
top--;
}
}
dfs1(1,0);
dfs2(1,0);
build(1,1,tot);
while(q--){
char op;
ll a,b;
cin>>op>>a>>b;
if(op=='C'){
p[a].erase({w[a],a});
if(father[a]) p[father[a]].erase({w[a],a});
w[a]=b;
p[a].insert({w[a],a});
if(father[a]) p[father[a]].insert({w[a],a});
change(1,1,tot,id[a]);
if(father[a]) change(1,1,tot,id[father[a]]);
}
else cout<<get(a,b)<<endl;
}
return 0;
}