CHANGE 直接 RE,QMAX WA 了,交上去 MLE。
#include<bits/stdc++.h>
using namespace std;
const int N=3e4+4;
#define ll long long
#define ls(x) x<<1
#define rs(x) x<<1|1
#define inf 1e18
int n,q;
int u,v,x,y;
int a[N],cnt;
int sz[N],son[N],dfn[N],top[N],fa[N],rnk[N],dep[N],siz[N<<2];
ll w[N<<2],maxx[N<<2];
vector<int>G[N];
string s;
void dfs1(int u,int father){
dep[u]=dep[father]+1;
fa[u]=father;
sz[u]=1;
for(int i=0;i<G[u].size();i++){
int v=G[u][i];
if(v==father){
continue;
}
dfs1(v,u);
sz[u]+=sz[v];
if(sz[v]>sz[son[u]]){
son[u]=v;
}
}
}
void dfs2(int u,int tp){
top[u]=tp,dfn[u]=++cnt;
rnk[dfn[u]]=u;
if(!son[u]){
return;
}
dfs2(son[u],tp);
for(int i=0;i<G[u].size();i++){
int v=G[u][i];
if(v!=fa[u]&&v!=son[u]){
dfs2(v,v);
}
}
}
void pushup(int u){
w[u]=w[ls(u)]+w[rs(u)];
maxx[u]=max(maxx[ls(u)],maxx[rs(u)]);
}
void build(int u,int l,int r){
if(l==r){
siz[u]=1;
w[u]=a[rnk[l]];
return;
}
siz[u]=r-l+1;
int mid=l+r>>1;
build(ls(u),l,mid);
build(rs(u),mid+1,r);
pushup(u);
}
void update(int u,int l,int r,int pos,int p){
if(l==pos&&r==pos){
w[u]=maxx[u]=p; return;
}
int mid=l+r>>1;
update(ls(u),l,mid,pos,p);
update(rs(u),mid+1,r,pos,p);
pushup(u);
}
ll qry_max(int u,int l,int r,int L,int R){
if(L<=l&&r<=R){
return maxx[u];
}
else if(!(r<L||R<l)){
int mid=l+r>>1;
return max(qry_max(ls(u),l,mid,L,R),qry_max(rs(u),mid+1,r,L,R));
}
return -inf;
}
ll qry_sum(int u,int l,int r,int L,int R){
if(L<=l&&r<=R){
return w[u];
}
else if(!(r<L||R<l)){
int mid=l+r>>1;
return qry_sum(ls(u),l,mid,L,R)+qry_sum(rs(u),mid+1,r,L,R);
}
return 0;
}
ll ask(int x,int y,bool type){
ll ans=0;
while(top[x]!=top[y]){
if(dep[top[x]]<dep[top[y]]){
swap(x,y);
}
if(type==0){
ans=max(ans,qry_max(1,1,n,dfn[top[x]],dfn[x]));
}
else{
ans+=qry_sum(1,1,n,dfn[top[x]],dfn[x]);
}
x=fa[top[x]];
}
if(dfn[x]>dfn[y]){
swap(x,y);
}
if(type==0){
return max(ans,qry_max(1,1,n,dfn[x],dfn[y]));
}
return ans+qry_sum(1,1,n,dfn[x],dfn[y]);
}
int main(){
cin.tie(0)->sync_with_stdio(0);
cin>>n;
for(int i=1;i<n;i++){
cin>>u>>v;
G[u].push_back(v);
G[v].push_back(u);
}
for(int i=1;i<=n;i++){
cin>>a[i];
}
dfs1(1,0);
dfs2(1,0);
build(1,1,n);
cin>>q;
while(q--){
cin>>s>>x>>y;
if(s=="CHANGE"){
update(1,1,n,x,y);
}
else if(s=="QMAX"){
cout<<ask(x,y,0)<<"\n";
}
else{
cout<<ask(x,y,1)<<"\n";
}
}
return 0;
}