拜谢。
#include <bits/stdc++.h>
#define re register
#define il inline
#define N 200010
using namespace std;
int dep[N], hd[N], lnsz, dfn[N], low[N], colsz, dfnt, inst[N], stk[N], stktp, n, m, u, v, q, sbtsz[N], ref_to_c[N], cnsz, fa[N], w[N], hs[N], rf[N], rft, refsz[N];
char op;
vector<int> ve[N];
multiset<int> pq[N];
struct SegmentTree
{
int sz[800010];
void pushup(int nw)
{
sz[nw] = min(sz[nw * 2], sz[nw * 2 + 1]);
}
void modify(int pos, int v, int nwL = 1, int nwR = 131072, int nw = 1)
{
if (nwL == nwR)
{
sz[nw] = v;
return;
}
#define M ((nwL + nwR) >> 1)
if (pos > M)
modify(pos, v, M + 1, nwR, nw * 2 + 1);
else
modify(pos, v, nwL, M, nw * 2);
#undef M
pushup(nw);
}
int ask(int R, int L = 1, int nw = 1, int nwL = 1, int nwR = 131072)
{
if (R < L)
return 2147483647;
if (L <= nwL && nwR <= R)
return sz[nw];
int tmp = 2147483647;
#define M ((nwL + nwR) >> 1)
if (R > M)
tmp = min(tmp, ask(R, max(L, M + 1), nw * 2 + 1, M + 1, nwR));
if (L <= M)
tmp = min(tmp, ask(min(R, M), L, nw * 2, nwL, M));
#undef M
return tmp;
}
} Tree;
struct chain
{
int tp, ed;
} cn[100010];
struct ln
{
int u, v, nxt;
} a[500010];
void mrg(int u, int v)
{
a[++lnsz].u = u;
a[lnsz].v = v;
a[lnsz].nxt = hd[u];
hd[u] = lnsz;
}
void tarjan(int nw, int fa)
{
int snt = 0;
dfn[nw] = low[nw] = ++dfnt;
stk[++stktp] = nw, inst[nw] = 1;
for (int i = hd[nw]; i; i = a[i].nxt)
{
if (!dfn[a[i].v])
{
snt++;
tarjan(a[i].v, nw);
low[nw] = min(low[nw], low[a[i].v]);
if (low[a[i].v] >= dfn[nw])
{
colsz++;
while (stk[stktp + 1] != a[i].v)
ve[colsz + n].emplace_back(stk[stktp]), ve[stk[stktp--]].emplace_back(colsz + n);
ve[colsz + n].emplace_back(nw);
ve[nw].emplace_back(colsz + n);
}
}
else if (inst[a[i].v])
low[nw] = min(low[nw], dfn[a[i].v]);
}
}
void dfs1(int nw, int fa)
{
dep[nw] = dep[fa] + 1;
sbtsz[nw] = 1;
::fa[nw] = fa;
for (int v : ve[nw])
{
if (v == fa)
continue;
dfs1(v, nw);
sbtsz[nw] += sbtsz[v];
if (sbtsz[v] > sbtsz[hs[nw]])
hs[nw] = v;
}
}
void dfs2(int nw, int cn)
{
rf[nw] = ++rft;
if (nw <= n)
Tree.modify(rf[nw], w[nw]), refsz[nw] = w[nw];
else
{
for (int v : ve[nw])
if (v != fa[nw])
pq[nw - n].emplace(w[v]);
Tree.modify(rf[nw], refsz[nw] = *pq[nw - n].begin());
}
ref_to_c[nw] = cn;
if (ve[nw].empty())
{
::cn[cn].ed = nw;
return;
}
if (hs[nw])
dfs2(hs[nw], cn);
for (int v : ve[nw])
{
if (v == fa[nw] || v == hs[nw])
continue;
::cn[++cnsz].tp = v;
dfs2(v, cnsz);
}
}
int lca(int a, int b)
{
int ans = 2147483647;
while (ref_to_c[a] != ref_to_c[b])
{
if (dep[cn[ref_to_c[a]].tp] < dep[cn[ref_to_c[b]].tp])
{
ans = min(ans, Tree.ask(rf[b], rf[cn[ref_to_c[b]].tp]));
b = fa[cn[ref_to_c[b]].tp];
}
else
{
ans = min(ans, Tree.ask(rf[a], rf[cn[ref_to_c[a]].tp]));
a = fa[cn[ref_to_c[a]].tp];
}
}
if (dep[a] < dep[b])
return min(min(ans, a > n ? refsz[fa[a]] : 2147483647), Tree.ask(rf[b], rf[a]));
return min(min(ans, b > n ? refsz[fa[b]] : 2147483647), Tree.ask(rf[a], rf[b]));
}
signed main()
{
ios::sync_with_stdio(false);
cin.tie(), cout.tie();
memset(Tree.sz, 0x3f, sizeof(Tree.sz));
memset(refsz, 0x3f, sizeof(refsz));
cin >> n >> m >> q;
for (int i = 1; i <= n; i++)
cin >> w[i];
for (int i = 1; i <= m; i++)
{
cin >> u >> v;
mrg(u, v);
mrg(v, u);
}
for (int i = 1; i <= n; i++)
if (!dfn[i])
stktp = 0, tarjan(i, 0);
dfs1(1, 0);
cn[++cnsz].tp = 1;
Tree.modify(1, w[1]);
dfs2(1, 1);
while (q--)
{
cin >> op >> u >> v;
if (op == 'C')
{
if (fa[u])
{
pq[fa[u] - n].erase(w[u]);
pq[fa[u] - n].insert(v);
Tree.modify(rf[fa[u]], refsz[fa[u]] = *pq[fa[u] - n].begin());
}
Tree.modify(rf[u], v);
refsz[u] = v;
w[u] = v;
}
else
cout << lca(u, v) << '\n';
}
return 0;
}