1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115
| #include<iostream> #include<cstdio> #include<cstring> #include<string> #include<algorithm> #include<set> #include<vector> using namespace std;
const int CN = 2e5 + 5; const int INF = 0x3f3f3f3f;
int read() {int s = 0,ne = 1; char c = getchar(); while(c < '0' || c > '9') ne = c == '-' ? -1 : 1, c = getchar(); while(c >= '0' && c <= '9') s = (s << 1) + (s << 3) + c - '0', c = getchar(); return s * ne;}
class fs {public: int to,nxt; void init(int t,int n) {to = t, nxt = n;} } E[CN << 1]; int hd[CN], ecnt = 0; void add(int x,int y) {E[++ecnt].init(y, hd[x]); hd[x] = ecnt;}
int n, m, q;
multiset<int> val[CN]; vector<int> T[CN]; int dfn[CN], low[CN], dfc = 0, w[CN], ext = 0, stk[CN], tp = 0; void bd(int u, int p){ dfn[u] = low[u] = ++dfc, stk[++tp] = u; for(int k = hd[u]; k; k = E[k].nxt){ int v = E[k].to; if(!dfn[v]){ bd(v, u), low[u] = min(low[u], low[v]); if(low[v] == dfn[u]){ int pos = 0; ext++; while(pos ^ v) pos = stk[tp--], T[ext].push_back(pos), val[ext].insert(w[pos]); w[ext] = *val[ext].begin(), T[u].push_back(ext); } } else low[u] = min(low[u], dfn[v]); } }
class SGT { public: int d[CN << 2]; #define lc k << 1 #define rc k << 1 | 1 void md(int l, int r, int k, int p, int x){ if(l == r) return (void)(d[k] = x); int m = (l + r) >> 1; if(p <= m) md(l, m, lc, p, x); else md(m + 1, r, rc, p, x); d[k] = min(d[lc], d[rc]); } int qu(int l, int r, int k, int s, int t){ if(s <= l && r <= t) return d[k]; int m = (l + r) >> 1, ans = INF; if(s <= m) ans = qu(l, m, lc, s, t); if(m < t) ans = min(ans, qu(m + 1, r, rc, s, t)); return ans; } } D;
int dep[CN], id[CN], idx = 0, top[CN], imp[CN], sz[CN], fa[CN]; void dfs1(int u, int p){ fa[u] = p, dep[u] = dep[p] + 1, sz[u] = 1; int mx = 0, l = T[u].size(); for(int i = 0; i < l; i++){ int v = T[u][i]; dfs1(v, u), sz[u] += sz[v], imp[u] = mx < sz[v] ? mx = sz[v], v : imp[u]; } } void dfs2(int u, int t){ id[u] = ++idx, D.md(1, ext, 1, id[u], w[u]), top[u] = t; if(imp[u]) dfs2(imp[u], t); int l = T[u].size(); for(int i = 0; i < l; i++){ int v = T[u][i]; if(v ^ imp[u]) dfs2(v, v); } }
int qu(int x, int y){ int ans = INF; while(top[x] ^ top[y]){ if(dep[ top[x] ] < dep[ top[y] ]) swap(x, y); ans = min(ans, D.qu(1, ext, 1, id[ top[x] ], id[x])); x = fa[ top[x] ]; } if(dep[x] < dep[y]) swap(x, y); ans = min(ans, D.qu(1, ext, 1, id[y], id[x])); if(y > n) ans = min(ans, w[ fa[y] ]); return ans; }
int main() { freopen("_in.in", "r", stdin);
ext = n = read(), m = read(), q = read(); for(int i = 1; i <= n; i++) w[i] = read(); while(m--){ int u = read(), v = read(); add(u, v), add(v, u); }
bd(1, 0), dfs1(1, 0), dfs2(1, 1);
while(q--){ char c; cin >> c; int a = read(), b = read(); if(c == 'C'){ D.md(1, ext, 1, id[a], b); int f = fa[a]; if(f > n){ val[f].erase(w[a]), val[f].insert(b); if(*val[f].begin() ^ w[f]) w[f] = *val[f].begin(), D.md(1, ext, 1, id[f], w[f]); } w[a] = b; } else printf("%d", qu(a, b)), puts(""); }
return 0; }
|