佬们看看罢蒟蒻调了几年了就是过不了(大哭)
#include<iostream>
#include<cstdio>
#include<vector>
#include<cstring>
#include<set>
#include<cmath>
#define re register int
#define il inline
using namespace std;
typedef long long ll;
const int N=100010;
multiset<ll> s[N<<1];
int n,x,y,m,tot,tot1,head[N<<1],Head[N<<1],Top[N<<1],fa[N<<1],top,stk[N<<1],low[N<<1],cnt,dfn[N<<1],num,dep[N<<1],son[N<<1],size[N<<1],Q,DFN[N<<1];
ll tree[N<<5];
ll a[N<<1];
int to[N<<3][2],Next[N<<3][2];
il int read(){
char ch=getchar();
int x=0,f=1;
while(ch<'0'||ch>'9'){
if(ch=='-')f=-1;
ch=getchar();
}
while(ch>='0'&&ch<='9'){
x=(x<<3)+(x<<1)+(ch-'0');
ch=getchar();
}
return f*x;
}
il ll Read(){
char ch=getchar();
ll x=0,f=1ll;
while(ch<'0'||ch>'9'){
if(ch=='-')f=-1ll;
ch=getchar();
}
while(ch>='0'&&ch<='9'){
x=(x<<3)+(x<<1)+(ch-'0');
ch=getchar();
}
return f*x;
}
il void add(int u,int v){
tot++;
Next[tot][0]=head[u];
to[tot][0]=v;
head[u]=tot;
}
il void Add(int u,int v){
tot1++;
Next[tot1][1]=Head[u];
to[tot1][1]=v;
Head[u]=tot1;
}
il void tarjan(int now){
top++;
stk[top]=now;
num++;
dfn[now]=num;
low[now]=dfn[now];
for(int i=head[now];i;i=Next[i][0]){
int To=to[i][0];
if(!dfn[To]){
tarjan(To);
low[now]=min(low[now],low[To]);
if(low[To]==dfn[now]){
cnt++;
int xx=0;
while(xx!=To){
xx=stk[top];
top--;
Add(cnt,xx);
Add(xx,cnt);
}
Add(cnt,now);
Add(now,cnt);
}
}
else low[now]=min(low[now],dfn[To]);
}
}
il void dfs(int now,int Fa){
size[now]=1;
for(int i=Head[now];i;i=Next[i][1]){
int To=to[i][1];
if(To!=Fa){
fa[To]=now;
dep[To]=dep[now]+1;
dfs(To,now);
size[now]+=size[To];
if(size[To]>size[son[now]])son[now]=To;
}
}
}
il void dfs1(int now,int tp){
num++;
dfn[now]=num;
DFN[num]=now;
Top[now]=tp;
if(son[now])dfs1(son[now],tp);
for(int i=Head[now];i;i=Next[i][1]){
int To=to[i][1];
if(To!=son[now]&&dep[To]==dep[now]+1)
dfs1(To,To);
}
}
il void build(int k,int l,int r){
if(l==r){
tree[k]=a[DFN[l]];
return;
}
int mid=(l+r)>>1;
build(k<<1,l,mid);
build(k<<1|1,mid+1,r);
tree[k]=min(tree[k<<1],tree[k<<1|1]);
}
il void modify(int k,int l,int r,int x,ll v){
if(l==r){
tree[k]=v;
return;
}
int mid=(l+r)>>1;
if(x<=mid)modify(k<<1,l,mid,x,v);
else modify(k<<1|1,mid+1,r,x,v);
tree[k]=min(tree[k<<1],tree[k<<1|1]);
}
il ll ask(int k,int l,int r,int L,int R){
if(l>R||r<L)return 1e18;
if(l>=r&&r<=R)return tree[k];
int mid=(l+r)>>1;
ll res=1e18;
if(L<=mid)res=min(res,ask(k<<1,l,mid,L,R));
if(R>mid)res=min(res,ask(k<<1|1,mid+1,r,L,R));
return res;
}
il ll Ask(int u,int v){
ll res=1e18;
while(Top[u]!=Top[v]){
if(dep[Top[u]]<dep[Top[v]])swap(u,v);
res=min(res,ask(1,1,cnt,dfn[Top[u]],dfn[u]));
u=fa[Top[u]];
}
if(dfn[u]>dfn[v])swap(u,v);
res=min(res,ask(1,1,cnt,dfn[u],dfn[v]));
if(u>n)res=min(res,a[fa[u]]);
return res;
}
int main(){
n=read();m=read();Q=read();
cnt=n;
for(re i=1;i<=n;i++)a[i]=Read();
for(re i=1;i<=m;i++){
x=read();
y=read();
add(x,y);
add(y,x);
}
tarjan(1);
num=0;
memset(dep,0,sizeof(dep));
dep[1]=1;
dfs(1,1);
for(re i=2;i<=n;i++)s[fa[i]].insert(a[i]);
dfs1(1,1);
for(re i=n+1;i<=cnt;i++)a[i]=*s[i].begin();
build(1,1,cnt);
int sss=0;
while(Q--){
sss++;
char op=getchar();
while(op!='A'&&op!='C')op=getchar();
if(op=='C'){
ll kk;
scanf("%d%lld",&x,&kk);
modify(1,1,cnt,dfn[x],kk);
if(fa[x]){
s[fa[x]].erase(s[fa[x]].find(a[x]));
s[fa[x]].insert(kk);
if(a[fa[x]]!=*s[fa[x]].begin()){
a[fa[x]]=*s[fa[x]].begin();
modify(1,1,cnt,dfn[fa[x]],a[fa[x]]);
}
}
a[x]=kk;
}
else{
scanf("%d%d",&x,&y);
printf("%lld\n",Ask(x,y));
}
}
return 0;
}