rt,样例过了但是全WA
#include<bits/stdc++.h>
using namespace std;
using ll = long long;
#define int ll
const int maxn =3e4 + 7;
const int inf = -3e6 - 7;
vector<int> G[maxn];
int a[maxn], top[maxn], sz[maxn], wc[maxn], dep[maxn], fa[maxn], dfn[maxn], rdfn[maxn];
int w[maxn*4], lzy[maxn*4], w2[maxn*4];
int n, q, vistime;
void dfs1(int u, int f){
sz[u] = 1;
dep[u] = dep[f] + 1;
fa[u] = f;
for(int i = 0; i < G[u].size(); ++i) if(G[u][i] != f){
int v = G[u][i];
dfs1(v, u);
sz[u] += sz[v];
if(sz[v] > sz[wc[u]]) wc[u] = v;
}
}
void dfs2(int u, int Top){
dfn[u] = ++vistime;
rdfn[vistime] = u;
top[u] = Top;
if(wc[u] != 0){
dfs2(wc[u], Top);
for(int i = 0; i < G[u].size(); ++i) if(G[u][i] != wc[u] && G[u][i] != fa[u]){
dfs2(G[u][i], G[u][i]);
}
}
}
bool InRange(int L, int R, int l, int r){
return (L >= l) && (R <= r);
}
bool OutofRange(int L, int R, int l, int r){
return (L > r) || (R < l);
}
void pushup(const int u){
w[u] = max(w[u*2], w[u*2+1]);
w2[u] = w2[u*2] + w2[u*2+1];
}
void build(const int u, int L, int R){
if(L == R){
w2[u] = w[u] = a[rdfn[L]];
return;
}
int mid = (L+R)>>1;
build(u*2, L, mid);
build(u*2+1, mid + 1, R);
pushup(u);
}
void update(const int u, int L, int R, int l, int r, int x){
if(InRange(L, R, l, r)){
w2[u] = w[u] = x;
}else if(!OutofRange(L, R, l, r)){
int mid = (L+R)>>1;
update(u*2, L, mid, l, r, x);
update(u*2+1, mid + 1, R, l, r, x);
pushup(u);
}
}
int query(const int u, int L, int R, int l, int r){
if(InRange(L, R, l, r)){
return w[u];
}else if(!OutofRange(L, R, l, r)){
int mid = (L+R)>>1;
return max(query(u*2,L,mid,l,r), query(u*2+1,mid+1,R,l,r));
}else return 0;
}
int query2(const int u, int L, int R, int l, int r){
if(InRange(L, R, l, r)){
return w2[u];
}else if(!OutofRange(L, R, l, r)){
int mid = (L+R)>>1;
return query2(u*2, L, mid, l, r) + query2(u*2+1, mid+1, R, l, r);
}else return 0;
}
int qry(int x, int y){
int ans = 0;
while(top[x] != top[y]){
if(dep[top[x]] < dep[top[y]]) swap(x, y);
ans += query2(1, 1, n, dfn[top[x]], dfn[x]);
x = fa[top[x]];
}
ans += query2(1, 1, n, min(dfn[x], dfn[y]), max(dfn[x], dfn[y]));
return ans;
}
int qry2(int x, int y){
int ans = inf;
while(top[x] != top[y]){
if(dep[top[x]] < dep[top[y]]) swap(x, y);
ans = max(ans, query(1, 1, n, dfn[top[x]], dfn[x]));
x = fa[top[x]];
}
ans = max(ans, query(1, 1, n, min(dfn[x], dfn[y]), max(dfn[x], dfn[y])));
return ans;
}
signed main(){
ios::sync_with_stdio(false);cin.tie(nullptr);
cin >> n;
for(int i = 1;i < n; ++i){
int x, y;
cin >> x >> y;
G[x].push_back(y);
G[y].push_back(x);
}
for(int i = 1; i <= n; ++i){cin >> a[i];}
dfs1(1, 0);
dfs2(1, 0);
build(1, 1, n);
cin >> q;
while(q--){
string s;
cin >> s;
int u, v, t;
if(s == "CHANGE"){
cin >> u >> t;
update(1, 1, n, u, u, t);
}else if(s == "QMAX"){
cin >> u >> v;
cout << qry2(u, v);
if(q != 0)cout << '\n';
}else{
cin >> u >> v;
cout << qry(u, v);
if(q != 0) cout << '\n';
}
}
return 0;
}