我无语了,对着题解看就是找不出哪错了
#include <bits/stdc++.h>
using namespace std;
const int N=3e4+5;
int n,q,w[N];
struct Edge{
int to,nxt;
}edge[N<<1];
int head[N],cnt_edge;
int fa[N],son[N],siz[N],depth[N],top[N],id[N],rk[N],cnt_id;
int tree1[N<<2],tree2[N<<2];
void add(int u,int v){
edge[cnt_edge].to=v;
edge[cnt_edge].nxt=head[u];
head[u]=cnt_edge++;
}
void dfs1(int u,int f){
fa[u]=f,siz[u]=1,depth[u]=depth[f]+1;
for(int i=head[u];~i;i=edge[i].nxt){
if(edge[i].to!=f){
dfs1(edge[i].to,u);
siz[u]+=siz[edge[i].to];
if(!son[u] || siz[son[u]]<siz[edge[i].to]) son[u]=edge[i].to;
}
}
}
void dfs2(int u,int topu){
top[u]=topu,id[u]=++cnt_id,rk[cnt_id]=u;
if(son[u]) dfs2(son[u],topu);
for(int i=head[u];~i;i=edge[i].nxt){
if(edge[i].to!=fa[u] && edge[i].to!=son[u]){
dfs2(edge[i].to,edge[i].to);
}
}
}
void build(int u,int l,int r){
if(l==r){
tree1[u]=w[rk[l]],tree2[u]=w[rk[l]];
return;
}
int mid=(l+r)>>1;
build(u<<1,l,mid);
build(u<<1|1,mid+1,r);
tree1[u]=max(tree1[u<<1],tree1[u<<1|1]);
tree2[u]=tree2[u<<1]+tree2[u<<1|1];
}
void update(int u,int l,int r,int x,int k){
if(l==r && l==x){
tree1[u]=k,tree2[u]=k;
return;
}
int mid=(l+r)>>1;
if(x<=mid) update(u<<1,l,mid,x,k);
else update(u<<1|1,mid+1,r,x,k);
tree1[u]=max(tree1[u<<1],tree1[u<<1|1]);
tree2[u]=tree2[u<<1]+tree2[u<<1|1];
}
int query1(int u,int l,int r,int L,int R){
if(L<=l && r<=R) return tree1[u];
int mid=(l+r)>>1,ans=-0x3f3f3f3f;
if(L<=mid) ans=max(ans,query1(u<<1,l,mid,L,R));
if(R>mid) ans=max(ans,query1(u<<1|1,mid+1,r,L,R));
return ans;
}
int query2(int u,int l,int r,int L,int R){
if(L<=l && r<=R) return tree2[u];
int mid=(l+r)>>1,ans=0;
if(L<=mid) ans+=query2(u<<1,l,mid,L,R);
if(R>mid) ans+=query2(u<<1|1,mid+1,r,L,R);
return ans;
}
int main(){
scanf("%d",&n);
for(int i=1;i<=n;i++) head[i]=-1;
int u,v;
for(int i=1;i<n;i++){
scanf("%d%d",&u,&v);
add(u,v),add(v,u);
}
for(int i=1;i<=n;i++) scanf("%d",&w[i]);
dfs1(1,0);
dfs2(1,1);
build(1,1,n);
scanf("%d",&q);
string op;
while(q--){
cin >> op;
scanf("%d%d",&u,&v);
if(op=="CHANGE") update(1,1,n,id[u],v);
else if(op=="QMAX"){
int ans=-0x3f3f3f3f;
while(depth[top[u]]!=depth[top[v]]){
if(depth[top[u]]<depth[top[v]]) swap(u,v);
ans=max(ans,query1(1,1,n,id[top[u]],id[u]));
u=fa[top[u]];
}
if(depth[u]>depth[v]) swap(u,v);
ans=max(ans,query1(1,1,n,id[u],id[v]));
printf("%d\n",ans);
}
else{
int ans=0;
while(depth[top[u]]!=depth[top[v]]){
if(depth[top[u]]<depth[top[v]]) swap(u,v);
ans+=query2(1,1,n,id[top[u]],id[u]);
u=fa[top[u]];
}
if(depth[u]>depth[v]) swap(u,v);
ans+=query2(1,1,n,id[u],id[v]);
printf("%d\n",ans);
}
}
}