Please subscribe to the official Codeforces channel in Telegram via the link https://t.me/codeforces_official. ×

 
 
 
 
General
 
 
# Author Problem Lang Verdict Time Memory Sent Judged  
161860369 Practice:
Alex_Wei
487E - 28 C++17 (GCC 9-64) Accepted 1169 ms 65492 KB 2022-06-26 15:36:30 2022-06-26 15:36:30
→ Source
#include <bits/stdc++.h>
using namespace std;
const int N = 2e5 + 5;
int n, m, q, w[N];
vector<int> e[N], g[N];
int dn, node, dfn[N], low[N], vis[N];
stack<int> stc;
void tarjan(int id) {
  vis[id] = 1, stc.push(id);
  dfn[id] = low[id] = ++dn;
  for(int it : e[id]) {
    if(!dfn[it]) {
      tarjan(it), low[id] = min(low[id], low[it]);
      if(low[it] == dfn[id]) {
        g[++node].push_back(id);
        g[id].push_back(node);
        for(int x = 0; x != it; stc.pop()) {
          g[node].push_back(x = stc.top());
          g[x].push_back(node);
          vis[x] = 0;
        }
      }
    }
    else if(vis[it]) low[id] = min(low[id], dfn[it]);
  }
}
int fa[N], top[N], son[N], dep[N], sz[N], rev[N];
multiset<int> sonv[N];
void dfs1(int id, int ff) {
  // cerr << "dfs " << id << " " << ff << endl;
  fa[id] = ff, sz[id] = 1, dep[id] = dep[ff] + 1;
  for(int it : g[id]) {
    if(it == ff) continue;
    dfs1(it, id), sz[id] += sz[it];
    if(sz[son[id]] < sz[it]) son[id] = it;
    if(id > n) sonv[id].insert(w[it]);
  }
}
void dfs2(int id, int tp) {
  top[id] = tp, dfn[id] = ++dn, rev[dn] = id;
  if(son[id]) dfs2(son[id], tp);
  for(int it : g[id]) if(it != fa[id] && it != son[id]) dfs2(it, it);
}
int val[N << 2];
void build(int l, int r, int x) {
  if(l == r) return val[x] = w[rev[l]], void();
  int m = l + r >> 1;
  build(l, m, x << 1), build(m + 1, r, x << 1 | 1);
  val[x] = min(val[x << 1], val[x << 1 | 1]);
}
void modify(int l, int r, int p, int x) {
  if(l == r) return val[x] = w[rev[p]], void();
  int m = l + r >> 1;
  if(p <= m) modify(l, m, p, x << 1);
  else modify(m + 1, r, p, x << 1 | 1);
  val[x] = min(val[x << 1], val[x << 1 | 1]);
}
int query(int l, int r, int ql, int qr, int x) {
  if(ql > qr) assert(0);
  // cerr << x << endl;
  if(ql <= l && r <= qr) return val[x];
  int m = l + r >> 1, ans = 1e9;
  if(ql <= m) ans = min(ans, query(l, m, ql, qr, x << 1));
  if(m < qr) ans = min(ans, query(m + 1, r, ql, qr, x << 1 | 1));
  return ans;
}
int main() {
  // freopen("1.in", "r", stdin);
  cin >> n >> m >> q, node = n;
  for(int i = 1; i <= n; i++) cin >> w[i];
  for(int i = 1; i <= m; i++) {
    int a, b;
    cin >> a >> b;
    e[a].push_back(b), e[b].push_back(a);
  }
  tarjan(1), dfs1(1, 0), dn = 0, dfs2(1, 1);
  for(int i = n + 1; i <= node; i++) w[i] = *sonv[i].begin();
  build(1, node, 1);
  for(int i = 1; i <= q; i++) {
    // cerr << "i " << i << endl;
    char op;
    int x, y;
    cin >> op >> x >> y;
    if(op == 'A') {
      int ans = 1e9;
      while(top[x] != top[y]) {
        if(dep[top[x]] < dep[top[y]]) swap(x, y);
        ans = min(ans, query(1, node, dfn[top[x]], dfn[x], 1));
        x = fa[top[x]];
      }
      if(dep[x] > dep[y]) swap(x, y);
      ans = min(ans, query(1, node, dfn[x], dfn[y], 1)); // n -> node
      if(x > n) ans = min(ans, w[fa[x]]);
      cout << ans << "\n";
    }
    else {
      if(x == 1) {w[1] = y, modify(1, node, dfn[1], 1); continue;}
      int ff = fa[x];
      sonv[ff].erase(sonv[ff].find(w[x]));
      sonv[ff].insert(w[x] = y);
      w[ff] = *sonv[ff].begin();
      modify(1, node, dfn[ff], 1);
      modify(1, node, dfn[x], 1);
    }
  }
  return 0;
}
/*
2022/5/15
start thinking at
start coding at 20:49
finish debugging at 21:13
*/
?
Time: ? ms, memory: ? KB
Verdict: ?
Input
?
Participant's output
?
Jury's answer
?
Checker comment
?
Diagnostics
?
Click to see test details