为什么会RE...
#include<bits/stdc++.h>
using namespace std;
int n,m,q,cnt;
int val[400007];
int dfn[400007],low[400007],tim,F[400007];
stack<int> st;
vector<int> vec[400007],nvec[400007];
multiset<int> mt[400007];
void tarjan(int u){
dfn[u]=low[u]=++tim;st.push(u);
for(int i=0;i<vec[u].size();i++){
int v=vec[u][i];
if(F[u]==v) continue;
if(!dfn[v]){
F[v]=u;
tarjan(v);
low[u]=min(low[u],low[v]);
if(low[v]>=dfn[u]){
cnt++;int y;
do{
y=st.top();st.pop();
nvec[y].push_back(cnt);nvec[cnt].push_back(y);
mt[cnt].insert(val[y]);
}while(y!=v);
mt[cnt].insert(val[u]);
val[cnt]=*mt[cnt].begin();
nvec[u].push_back(cnt);nvec[cnt].push_back(u);
}
}
else low[u]=min(low[u],dfn[v]);
}
}
int son[400007],id[400007],fa[400007],tot,dep[400007],siz[400007],top[400007];
void dfs1(int u,int f,int deep){
dep[u]=deep;fa[u]=f;siz[u]=1;
int ms=-1;
for(int i=0;i<nvec[u].size();i++){
int v=nvec[u][i];
if(v==f) continue;
dfs1(v,u,deep+1);
siz[u]+=siz[v];
if(siz[v]>ms) son[u]=v,ms=siz[v];
}
}
int tval[400007];
void dfs2(int u,int topf){
id[u]=++tot;
tval[tot]=val[u];
top[u]=topf;
if(!son[u]) return ;
dfs2(son[u],topf);
for(int i=0;i<nvec[u].size();i++){
int v=nvec[u][i];
if(v==fa[u]||v==son[u]) continue;
dfs2(v,v);
}
}
int tr[1000000];
void built(int u,int l,int r){
if(l==r){tr[u]=tval[l];return ;}
int mid=(l+r)>>1,lk=u<<1,rk=lk|1;
built(lk,l,mid),built(rk,mid+1,r);
tr[u]=min(tr[lk],tr[rk]);
}
void change(int u,int l,int r,int po,int x){
if(l==r){tr[u]=x;return ;}
int mid=(l+r)>>1,lk=u<<1,rk=lk|1;
if(po<=mid) change(lk,l,mid,po,x);
else change(rk,mid+1,r,po,x);
tr[u]=min(tr[lk],tr[rk]);
}
int query(int u,int l,int r,int L,int R){
if(L<=l&&R>=r) return tr[u];
int mid=(l+r)>>1,lk=u<<1,rk=lk|1;
int ans=0x3f3f3f3f;
if(L<=mid) ans=min(ans,query(lk,l,mid,L,R));
if(R>mid) ans=min(ans,query(rk,mid+1,r,L,R));
return ans;
}
int qr(int u,int v){
int ans=0x3f3f3f3f;
while(top[u]!=top[v]){
if(dep[top[u]]<dep[top[v]]) swap(u,v);
ans=min(ans,query(1,1,cnt,id[top[u]],id[u]));
u=fa[top[u]];
}
if(dep[u]>dep[v]) swap(u,v);
ans=min(ans,query(1,1,cnt,id[u],id[v]));
return ans;
}
int main(){
ios::sync_with_stdio(0);
cin.tie(0);cout.tie(0);
cin>>n>>m>>q;cnt=n;
for(int i=1;i<=n;i++) cin>>val[i];
for(int i=1,u,v;i<=m;i++){
cin>>u>>v;
vec[u].push_back(v);
vec[v].push_back(u);
}
tarjan(1);
for(int i=1;i<=cnt;i++) tr[i]=0x3f3f3f3f;
dfs1(1,0,1);
dfs2(1,1);
built(1,1,cnt);
char opt;int a,b;
while(q--){
cin>>opt>>a>>b;
if(opt=='C'){
int ta=id[a];
change(1,1,cnt,ta,b);
for(int i=0;i<nvec[a].size();i++){
int v=nvec[a][i],best=*mt[v].begin(),cbest;
mt[v].erase(mt[v].find(tval[ta]));
mt[v].insert(b);
if((cbest=*mt[v].begin())!=best) change(1,1,cnt,id[v],cbest);
}
tval[a]=b;
}
if(opt=='A') cout<<qr(a,b)<<'\n';
}
return 0;
}