#include <bits/stdc++.h>
using namespace std;
int n;
vector<int> v[30010];
int cnt[30010],zh21[30010],fa[30010],nw[30010],zd[30010],kkksc03[30010],bh[30010],d[30010];
struct st{
int l,r;
int mx,sm;
}a[120010];
void pushup(int xxx){
a[xxx].sm=a[xxx*2].sm+a[xxx*2+1].sm;
a[xxx].mx=max(a[xxx*2].mx,a[xxx*2+1].mx);
}
void wo_yao_ji_can(int xxx,int l,int r){
a[xxx].l=l;
a[xxx].r=r;
int mid=(l+r)>>1;
if (l!=r){
wo_yao_ji_can(xxx*2,l,mid);
wo_yao_ji_can(xxx*2+1,mid+1,r);
pushup(xxx);
}
else{
a[xxx].mx=a[xxx].sm=kkksc03[bh[l]];
}
}
void change(int x,int c,int t){
if (a[x].r<c || a[x].l>c) return;
if (a[x].r==c && a[x].l==c){
a[x].sm=a[x].mx=t;
return;
}
change(2*x,c,t);
change(2*x+1,c,t);
pushup(x);
}
int serch(int x,int l,int r){
if (l>r) swap(l,r);
if (a[x].l>=l && a[x].r<=r) return a[x].sm;
if(a[x].r<l || a[x].l>r) return 0;
return serch(x*2,l,r)+serch(x*2+1,l,r);
}
int serchm(int x,int l,int r){
if (l>r) swap(l,r);
if (a[x].l>=l && a[x].r<=r) return a[x].mx;
if(a[x].r<l || a[x].l>r) return -138313;
return max(serchm(x*2,l,r),serchm(x*2+1,l,r));
}
void dfs1(int abc){
cnt[abc]=1;
zh21[abc]=-1;
int kk=-1;
for (int i=0;i<v[abc].size();i++){
if (v[abc][i]==fa[abc]) continue;
fa[v[abc][i]]=abc;
d[v[abc][i]]=d[abc]+1;
dfs1(v[abc][i]);
cnt[abc]+=cnt[v[abc][i]];
if (cnt[v[abc][i]]>kk) zh21[abc]=v[abc][i],kk=cnt[v[abc][i]];
}
}
int tme=0;
void dfs2(int arc){
tme++;
nw[arc]=tme;
bh[tme]=arc;
zd[zh21[arc]]=zd[arc];
if (zh21[arc]==-1) return;
dfs2(zh21[arc]);
for (int i=0;i<v[arc].size();i++){
if (v[arc][i] != fa[arc] && v[arc][i] !=zh21[arc]) {
zd[v[arc][i]]=v[arc][i];
dfs2(v[arc][i]);
}
}
}
int qsum(int a,int b){
int ct=0;
while (zd[a]!=zd[b]){
if (d[bh[zd[a]]]>d[bh[zd[b]]]) swap(a,b);
ct+=serch(1,zd[b],b);
b=fa[zd[b]];
}
if(d[bh[a]]>d[bh[b]]) swap(a,b);
ct+=serch(1,a,b);
return ct;
}
int qmax(int a,int b){
int maxx=-1809238;
while (zd[a]!=zd[b]){
if (d[bh[zd[a]]]>d[bh[zd[b]]]) swap(a,b);
maxx=max(maxx,serch(1,zd[b],b));
b=fa[zd[b]];
}
if(d[bh[a]]>d[bh[b]]) swap(a,b);
maxx=max(maxx,serch(1,a,b));
return maxx;
}
int main()
{
zd[1]=1;
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
cin>>n;
for (int i=1;i<=n-1;i++){
int sto,orz;
cin>>sto>>orz;
v[sto].push_back(orz);
v[orz].push_back(sto);
}
dfs1(1);
dfs2(1);
for (int i=1;i<=n;i++) cin>>kkksc03[i];
int m;
cin>>m;
wo_yao_ji_can(1,1,n);
while (m--){
string s;
int x,y;
cin>>s>>x>>y;
if (s=="QMAX") cout<<qmax(nw[x],nw[y])<<'\n';
if (s=="QSUM") cout<<qsum(nw[x],nw[y])<<'\n';
if (s=="CHANGE") change(1,nw[x],y);
}
return 0;
}
我不行了,求助万能谷民QWQ
珍爱生命远离树抛!