rt,看了下讨论区好像没有在修改操作传参的时候错 /kk
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int maxn = 5e5+5;
struct edge{int to,nxt;}e[maxn];int head[maxn],cnt,u,v,q;string s;
void add(int u,int v){e[++cnt].to = v,e[cnt].nxt = head[u],head[u] = cnt;}
int dep[maxn],siz[maxn],son[maxn],id[maxn],fa[maxn],top[maxn],tot,t1[maxn],t2[maxn],n,a[maxn];
void update(int s,int l,int r,int x,int k){
int mid = (l + r) / 2;
if(l == r) {t1[s] = k,t2[s] = k;return ;}
if(x <= mid) update(s*2,l,mid,x,k); else update(s*2+1,mid+1,r,x,k);
t1[s] = t1[s*2] + t1[s*2+1],t2[s] = max(t2[s*2],t2[s*2+1]);
}
int query1(int s,int l,int r,int ql,int qr){
int mid = (l + r) / 2,ans = 0;
if(ql <= l && r <= qr) return t1[s];
if(ql <= mid) ans += query1(s*2,l,mid,ql,qr);
if(qr >= mid+1) ans += query1(s*2+1,mid+1,r,ql,qr);
return ans;
}
int query2(int s,int l,int r,int ql,int qr){
int mid = (l + r) / 2,ans = -1e9;
if(ql <= l && r <= qr) return t2[s];
if(ql <= mid) ans = max(ans,query2(s*2,l,mid,ql,qr));
if(qr >= mid+1) ans = max(ans,query2(s*2+1,mid+1,r,ql,qr));
return ans;
}
void dfs1(int u,int fat){
fa[u] = fat,dep[u] = dep[fat] + 1,siz[u] = 1;
for(int i = head[u];i;i = e[i].nxt){
int v = e[i].to;if(v == fat) continue;
dfs1(v,u),siz[u] += siz[v];if(siz[v] > siz[son[u]]) son[u] = v;
}
}
void dfs2(int u,int tp){
id[u] = ++tot,top[u] = tp,update(1,1,n,tot,a[u]);
if(son[u]) dfs2(son[u],tp);
for(int i = head[u];i;i = e[i].nxt){
int v = e[i].to;if(v == fa[u] || v == son[u]) continue;
dfs2(v,v);
}
}
int query3(int u,int v){
int ans = 0;
while(top[u] != top[v]){
if(dep[top[u]] < dep[top[v]]) swap(u,v);
ans += query1(1,1,n,id[top[u]],id[u]),u = fa[top[u]];
}
if(dep[u] > dep[v]) swap(u,v);
return ans + query1(1,1,n,id[u],id[v]);
}
int query4(int u,int v){
int ans = -1e9;
while(top[u] != top[v]){
if(dep[top[u]] < dep[top[v]]) swap(u,v);
ans = max(ans,query2(1,1,n,id[top[u]],id[u])),u = fa[top[u]];
}
if(dep[u] > dep[v]) swap(u,v);
return max(ans,query2(1,1,n,id[u],id[v]));
}
signed main(){
cin >> n;
for(int i = 1;i < n;i ++) cin >> u >> v,add(u,v),add(v,u);
for(int i = 1;i <= n;i ++) cin >> a[i];cin >> q;
for(int i = 1;i <= n*4;i ++) t2[i] = -1e9;
dfs1(1,0),dfs2(1,1);
while(q --){
cin >> s >> u >> v;
if(s[0] == 'C') update(1,1,n,id[u],v);
else if(s[0] == 'Q' && s[1] == 'M') cout << query4(id[u],id[v]) << "\n";
else cout << query3(id[u],id[v]) << "\n";
}
return 0;
}