1 #include<bits/stdc++.h> 2 #define maxn 30005 3 #define lc T[k].lch 4 #define rc T[k].rch 5 #define update ans=-0x7fffffff;sum=0 6 using namespace std; 7 struct node{ 8 int to,next; 9 }edi[maxn*2]; 10 struct tree{ 11 int maxx,sum,l,r,lch,rch,f; 12 }T[maxn*4]; 13 int head[maxn],d[maxn],v[maxn],f[maxn],top[maxn],dfn[maxn],rk[maxn],son[maxn],siz[maxn],ord,ans,sum=0,cnt; 14 inline void add(int u,int v) 15 { 16 edi[++cnt].to=v; 17 edi[cnt].next=head[u]; 18 head[u]=cnt; 19 return ; 20 } 21 inline void up(int k) 22 { 23 T[k].maxx=max(T[lc].maxx,T[rc].maxx); 24 T[k].sum=T[lc].sum+T[rc].sum; 25 return ; 26 } 27 inline void down(int k) 28 { 29 T[lc].f+=T[k].f; 30 T[rc].f+=T[k].f; 31 T[lc].f+=T[k].f; 32 T[rc].f+=T[k].f; 33 T[lc].maxx+=T[k].f; 34 T[rc].maxx+=T[k].f; 35 T[lc].sum+=T[k].f*(T[lc].r-T[lc].l+1); 36 T[rc].sum+=T[k].f*(T[rc].r-T[rc].l+1); 37 T[k].f=T[k].f=0; 38 return ; 39 } 40 void dfs1(int x,int dep) 41 { 42 d[x]=dep;siz[x]=1; 43 for(int i=head[x];i;i=edi[i].next) 44 { 45 int k=edi[i].to; 46 if(d[k])continue; 47 f[k]=x; 48 dfs1(k,dep+1); 49 siz[x]+=siz[k]; 50 if(!son[x]||siz[son[x]]<siz[k])son[x]=k; 51 } 52 return ; 53 } 54 void dfs2(int x,int num) 55 { 56 top[x]=num;dfn[x]=++ord;rk[ord]=x; 57 if(!son[x])return ; 58 dfs2(son[x],num); 59 for(int i=head[x];i;i=edi[i].next) 60 { 61 int k=edi[i].to; 62 if(son[x]==k||dfn[k])continue; 63 dfs2(k,k); 64 } 65 return ; 66 } 67 void build(int k,int l,int r) 68 { 69 if(l==r) 70 { 71 T[k].l=T[k].r=l; 72 T[k].maxx=T[k].sum=v[rk[l]]; 73 return ; 74 } 75 T[k].l=l;T[k].r=r; 76 T[k].lch=(k<<1);T[k].rch=(k<<1)+1; 77 int mid=(l+r)>>1; 78 build(lc,l,mid); 79 build(rc,mid+1,r); 80 up(k); 81 return ; 82 } 83 void change(int k,int l,int r,int x) 84 { 85 if(T[k].l>=l&&T[k].r<=r) 86 { 87 T[k].maxx+=x; 88 T[k].sum+=x*(T[k].r-T[k].l+1); 89 T[k].f+=x; 90 return ; 91 } 92 if(T[k].f)down(k); 93 int mid=(T[k].l+T[k].r)>>1; 94 if(l<=mid)change(lc,l,r,x); 95 if(r>mid)change(rc,l,r,x); 96 up(k); 97 } 98 void qurvy_max(int k,int l,int r) 99 { 100 if(T[k].l>=l&&T[k].r<=r) 101 { 102 ans=max(ans,T[k].maxx); 103 return ; 104 } 105 if(T[k].f)down(k); 106 int mid=(T[k].l+T[k].r)>>1; 107 if(l<=mid)qurvy_max(lc,l,r); 108 if(r>mid)qurvy_max(rc,l,r); 109 up(k); 110 } 111 void qurvy_sum(int k,int l,int r) 112 { 113 if(T[k].l>=l&&T[k].r<=r) 114 { 115 sum+=T[k].sum; 116 return ; 117 } 118 if(T[k].f)down(k); 119 int mid=(T[k].l+T[k].r)>>1; 120 if(l<=mid)qurvy_sum(lc,l,r); 121 if(r>mid)qurvy_sum(rc,l,r); 122 up(k); 123 } 124 void change2(int k,int l,int x) 125 { 126 if(T[k].l==T[k].r&&T[k].l==l) 127 { 128 T[k].maxx+=x; 129 T[k].sum+=x*(T[k].r-T[k].l+1); 130 return ; 131 } 132 if(T[k].f)down(k); 133 int mid=(T[k].l+T[k].r)>>1; 134 if(l<=mid)change2(lc,l,x); 135 if(l>mid)change2(rc,l,x); 136 up(k); 137 } 138 int find_max(int a,int b) 139 { 140 update; 141 int fa=top[a],fb=top[b],anss=-0x7fffffff; 142 while(fa!=fb) 143 { 144 if(d[fa]<d[fb]) 145 { 146 swap(fa,fb); 147 swap(a,b); 148 } 149 update; 150 qurvy_max(1,dfn[fa],dfn[a]); 151 anss=max(anss,ans); 152 a=f[fa]; 153 fa=top[a]; 154 } 155 if(dfn[a]>dfn[b])swap(a,b); 156 update; 157 qurvy_max(1,dfn[a],dfn[b]); 158 anss=max(anss,ans); 159 return anss; 160 } 161 int find_sum(int a,int b) 162 { 163 update; 164 int fa=top[a],fb=top[b],summ=0; 165 while(fa!=fb) 166 { 167 if(d[fa]<d[fb]) 168 { 169 swap(fa,fb); 170 swap(a,b); 171 } 172 update; 173 qurvy_sum(1,dfn[fa],dfn[a]); 174 summ+=sum; 175 a=f[fa]; 176 fa=top[a]; 177 } 178 if(d[a]>d[b])swap(a,b); 179 update; 180 qurvy_sum(1,dfn[a],dfn[b]); 181 summ+=sum; 182 return summ; 183 } 184 void change_un(int a,int b,int x) 185 { 186 int fa=top[a],fb=top[b]; 187 while(fa!=fb) 188 { 189 if(d[fa]<d[fb]) 190 { 191 swap(fa,fb); 192 swap(a,b); 193 } 194 change(1,dfn[fa],dfn[a],x); 195 a=f[fa]; 196 fa=top[a]; 197 } 198 if(d[a]>d[b])swap(a,b); 199 change(1,dfn[a],dfn[b],x); 200 return ; 201 } 202 inline int read() 203 { 204 int x=0,f=1; 205 char c=getchar(); 206 while(c>'9'||c<'0'){if(c=='-')f=-1;c=getchar();} 207 while(c<='9'&&c>='0'){x=x*10+c-'0';c=getchar();} 208 return x*f; 209 } 210 int main() 211 { 212 int n=read(),m; 213 for(int i=1;i<n;i++) 214 { 215 int u=read(),v=read(); 216 add(u,v); 217 add(v,u); 218 } 219 for(int i=1;i<=n;i++)v[i]=read(); 220 dfs1(1,1); 221 dfs2(1,1); 222 build(1,1,n); 223 m=read(); 224 while(m--) 225 { 226 string s; 227 cin>>s; 228 if(s=="QMAX") 229 { 230 int a=read(),b=read(); 231 printf("%d ",find_max(a,b)); 232 } 233 else if(s=="QSUM") 234 { 235 int a=read(),b=read(); 236 printf("%d ",find_sum(a,b)); 237 } 238 else if(s=="CHANGE") 239 { 240 int a=read(),b=read(); 241 change2(1,dfn[a],b-v[a]); 242 v[a]=b; 243 } 244 } 245 }