rt 调不出来 qwq
#include<bits/stdc++.h>
#define inf 1e9
#define N 200005
using namespace std;
struct matrix{
int r[3][3];
}g[N],c;
matrix operator *(matrix a,matrix b)
{
for(int i=0;i<2;i++)
for(int j=0;j<2;j++)
c.r[i][j]=inf;
for(int i=0;i<2;i++)
for(int j=0;j<2;j++)
for(int k=0;k<2;k++)
c.r[i][j]=min(c.r[i][j],a.r[i][k]+b.r[k][j]);
return c;
}
int head[N],tot=1;
struct edge{
int to,next;
}e[N*2];
void add(int u,int v)
{
e[tot]=(edge){v,head[u]};
head[u]=tot++;
}
int n,m;
int w[N],f[N];
int fa[N],dep[N],siz[N],Son[N];
void dfs1(int now,int fath)
{
siz[now]=1;
fa[now]=fath;
dep[now]=dep[fath]+1;
int maxx=0;
for(int i=head[now];i;i=e[i].next)
{
int son=e[i].to;
if(son==fath) continue;
dfs1(son,now);
siz[now]+=siz[son];
if(siz[son]>maxx) maxx=siz[son],Son[now]=son;
f[now]+=f[son];
}
if(Son[now]) f[now]=min(f[now],w[now]);
else f[now]=w[now];
}
int top[N],id[N],ids,ed[N],pos[N];
void dfs2(int now,int topf)
{
top[now]=topf;
id[now]=ed[topf]=++ids;
pos[ids]=now;
g[now].r[0][0]=g[now].r[1][0]=g[now].r[1][1]=0;
g[now].r[0][1]=w[now];
if(!Son[now]) return;
dfs2(Son[now],topf);
for(int i=head[now];i;i=e[i].next)
{
int son=e[i].to;
if(son==Son[now]||son==fa[now]) return;
dfs2(son,son);
g[now].r[0][0]+=f[son];
}
}
matrix tr[N*4];
void modify(int l,int r,int p,int x)
{
if(l==r)
{
tr[x]=g[pos[p]];
return;
}
int mid=(l+r)/2;
if(p<=mid) modify(l,mid,p,x*2);
else modify(mid+1,r,p,x*2+1);
tr[x]=tr[x*2]*tr[x*2+1];
}
matrix query(int l,int r,int L,int R,int x)
{
if(l>=L&&r<=R) return tr[x];
int mid=(l+r)/2;
if(R<=mid) return query(l,mid,L,R,x*2);
if(L>mid) return query(mid+1,r,L,R,x*2+1);
return query(l,mid,L,R,x*2)*query(mid+1,r,L,R,x*2+1);
}
matrix lst,now;
void updata(int x,int v)
{
g[x].r[0][1]+=v;
w[x]+=v;
while(x)
{
lst=query(1,n,id[top[x]],ed[top[x]],1);
modify(1,n,id[x],1);
now=query(1,n,id[top[x]],ed[top[x]],1);
x=fa[top[x]];
g[x].r[0][0]+=now.r[0][1]-lst.r[0][1];
}
}
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++) scanf("%d",&w[i]);
for(int i=1;i<n;i++)
{
int u,v;
scanf("%d%d",&u,&v);
add(u,v);
add(v,u);
}
dfs1(1,0);
dfs2(1,1);
for(int i=1;i<=n;i++)
modify(1,n,i,1);
scanf("%d",&m);
while(m--)
{
char c;
int x,y;
cin>>c;
if(c=='Q')
{
scanf("%d",&x);
printf("%d\n",(query(1,n,id[x],ed[top[x]],1)).r[0][1]);
}
else
{
scanf("%d%d",&x,&y);
updata(x,y);
}
}
return 0;
}