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\n",find_max(a,b));
232 }
233 else if(s=="QSUM")
234 {
235 int a=read(),b=read();
236 printf("%d\n",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 }