20pts,AC on #5,#6
#include<bits/stdc++.h>
using namespace std;
#define ll long long
ll n,a,b,q,u,t,v,cnt,head[200010],siz[200010],fa[200010],seg[200010],
rev[200010],son[200010],dep[200010],tp[200010],ax[200010],sum[200010],
maxx[200010],tra[200010];
string s;
struct node
{
ll nxt,to;
}e[200010];
void add(ll u,ll v)
{
e[++cnt].to=v;
e[cnt].nxt=head[u];
head[u]=cnt;
return ;
}
ll read()
{
ll s=0,w=1;
char ch=getchar();
while(ch<'0'||ch>'9')
{
if(ch=='-')w=-1;
ch=getchar();
}
while(ch>='0'&&ch<='9')
{
s=(s<<1)+(s<<3)+ch-'0';
ch=getchar();
}
return s*w;
}
void write(ll x)
{
if(x<0)
{
putchar('-');
x=-x;
}
if(x<=9)putchar(x+'0');
else write(x/10),putchar(x%10+'0');
return ;
}
void dfs1(ll x,ll fat)
{
dep[x]=dep[fat]+1;
siz[x]=1;
fa[x]=fat;
for(int i=head[x];i;i=e[i].nxt)
{
if(e[i].to==fat)continue;
dfs1(e[i].to,x);
siz[x]+=siz[e[i].to];
if(siz[e[i].to]>siz[son[x]])son[x]=e[i].to;
}
return ;
}
void dfs2(ll x,ll fat)
{
if(son[x])
{
seg[son[x]]=++seg[0];
rev[seg[0]]=son[x];
tp[son[x]]=tp[x];
dfs2(son[x],x);
}
for(int i=head[x];i;i=e[i].nxt)
{
if(e[i].to==fat||e[i].to==son[x])continue;
dfs2(e[i].to,x);
seg[e[i].to]=++seg[0];
rev[seg[0]]=e[i].to;
tp[e[i].to]=e[i].to;
}
return ;
}
void build(ll id,ll l,ll r)
{
ll mid=(l+r)>>1;
if(l==r)
{
sum[id]=ax[rev[l]];
maxx[id]=ax[rev[l]];
return ;
}
build(id*2,l,mid);
build(id*2+1,mid+1,r);
sum[id]=sum[id*2]+sum[id*2+1];
maxx[id]=max(maxx[id*2],maxx[id*2+1]);
return ;
}
void psd(ll id,ll l,ll r)
{
if(tra[id]==-1e18)return ;
ll mid=(l+r)>>1;
tra[id*2]=tra[id];
sum[id*2]=tra[id]*(mid-l+1);
maxx[id*2]=tra[id];
tra[id*2+1]=tra[id];
sum[id*2+1]=tra[id]*(r-(mid+1)+1);
maxx[id*2+1]=tra[id];
tra[id]=-1e18;
return ;
}
void upd(ll id,ll l,ll r,ll x,ll y,ll t)
{
ll mid=(l+r)>>1;
if(l>y||r<x)return ;
if(l>=x&&r<=y)
{
tra[id]=t;
sum[id]=t*(r-l+1);
maxx[id]=t;
return ;
}
psd(id,l,r);
upd(id*2,l,mid,x,y,t);
upd(id*2+1,mid+1,r,x,y,t);
sum[id]=sum[id*2]+sum[id*2+1];
maxx[id]=max(maxx[id*2],maxx[id*2+1]);
return ;
}
ll qum(ll id,ll l,ll r,ll x,ll y)
{
ll mid=(l+r)>>1;
if(l>y||r<x)return -1e18;
if(l>=x&&r<=y)return maxx[id];
psd(id,l,r);
return max(qum(id*2,l,mid,x,y),qum(id*2+1,mid+1,r,x,y));
}
ll qus(ll id,ll l,ll r,ll x,ll y)
{
ll mid=(l+r)>>1;
if(l>y||r<x)return 0;
if(l>=x&&r<=y)return sum[id];
psd(id,l,r);
return qus(id*2,l,mid,x,y)+qus(id*2+1,mid+1,r,x,y);
}
ll qmax(ll id,ll u,ll v)
{
ll ans=-1e18,tmp1=tp[u],tmp2=tp[v];
while(tmp1!=tmp2)
{
if(dep[tmp1]<dep[tmp2])swap(u,v),swap(tmp1,tmp2);
ans=max(ans,qum(1,1,seg[0],seg[tmp1],seg[u]));
u=fa[tmp1];
tmp1=tp[u];
//cout<<"wda";
}
if(dep[u]>dep[v])swap(u,v);
ans=max(ans,qum(1,1,seg[0],seg[u],seg[v]));
return ans;
}
ll qsum(ll id,ll u,ll v)
{
ll ans=0,tmp1=tp[u],tmp2=tp[v];
while(tmp1!=tmp2)
{
if(dep[tmp1]<dep[tmp2])swap(u,v),swap(tmp1,tmp2);
ans+=qus(1,1,seg[0],seg[tmp1],seg[u]);
u=fa[tmp1];
tmp1=tp[u];
}
if(dep[u]>dep[v])swap(u,v);
ans+=qus(1,1,seg[0],seg[u],seg[v]);
return ans;
}
int main()
{
n=read();
for(int i=1;i<=n-1;i++)
{
a=read();
b=read();
add(a,b);
add(b,a);
}
for(int i=1;i<=n;i++)ax[i]=read();
seg[1]=++seg[0];
rev[seg[0]]=1;
tp[1]=1;
dfs1(1,0);
dfs2(1,0);
//cout<<"adw";
build(1,1,seg[0]);
for(int i=0;i<=200005;i++)tra[i]=-1e18;
//for(int i=1;i<=10;i++)cout<<qus(1,1,seg[0],1,3)<<endl;
q=read();
for(int i=1;i<=q;i++)
{
cin>>s;
if(s[1]=='H')
{
u=read();
t=read();
upd(1,1,seg[0],seg[u],seg[u],t);
}
if(s[1]=='M')
{
u=read();
v=read();
write(qmax(1,u,v));
putchar('\n');
}
if(s[1]=='S')
{
u=read();
v=read();
write(qsum(1,u,v));
putchar('\n');
}
}
return 0;
}