求调
#include <bits/stdc++.h>
#define int long long
#define N 100005
using namespace std;
int n,m;
int head[N],cnt;
int dep[N],siz[N],fa[N],cson[N];//dfs1
int w[N],id[N],topl[N],ti;//dfs2
struct Edge
{
int to,nex;
}e[N<<1];
struct Tree
{
int num,l,r,lz;
}tr[N<<2];
void up(int k){ tr[k].num=tr[k<<1].num+tr[k<<1|1].num; }
void down(int k)
{
tr[k<<1].lz+=tr[k].lz;
tr[k<<1|1].lz+=tr[k].lz;
tr[k<<1].num+=(tr[k<<1].r-tr[k<<1].l+1)*tr[k].lz;
tr[k<<1|1].num+=(tr[k<<1|1].r-tr[k<<1|1].l+1)*tr[k].lz;
tr[k].lz=0;
}
void build(int k,int ll,int rr)
{
tr[k]={0,ll,rr,0};
if(ll==rr) return;
int mid=ll+rr>>1;
build(k<<1,ll,mid);
build(k<<1|1,mid+1,rr);
up(k);
}
void modify(int k,int ll,int rr,int val)
{
if(tr[k].l>=ll && tr[k].r<=rr){
tr[k].num+=(tr[k].r-tr[k].l+1)*val;
tr[k].lz+=val;
return;
}
if(tr[k].lz) down(k);
if(tr[k<<1].r>=ll) modify(k<<1,ll,rr,val);
if(tr[k<<1|1].l<=rr) modify(k<<1|1,ll,rr,val);
up(k);
}
int query(int k,int ll,int rr)
{
if(tr[k].l>=ll && tr[k].r<=rr) return tr[k].num;
if(tr[k].lz) down(k);
int cnt=0;
if(tr[k<<1].r>=ll) cnt+=query(k<<1,ll,rr);
if(tr[k<<1|1].l<=rr) cnt+=query(k<<1|1,ll,rr);
return cnt;
}
void add(int u,int v)
{
e[++cnt].to=v;
e[cnt].nex=head[u];
head[u]=cnt;
}
void dfs1(int u,int dad)
{
dep[u]=dep[dad]+1;fa[u]=dad;siz[u]=1;
int mx=0;
for(int i=head[u];i;i=e[i].nex){
int v=e[i].to;
if(v==dad) continue;
dfs1(v,u);
siz[u]+=siz[v];
if(siz[v]>mx) mx=siz[v],cson[u]=v;
}
}
void dfs2(int u,int topu)
{
id[u]=++ti;w[ti]=0;topl[u]=topu;
if(!cson[u]) return;
dfs2(cson[u],topu);
for(int i=head[u];i;i=e[i].nex){
int v=e[i].to;
if(v!=fa[u] && v!=cson[u]) dfs2(v,v);
}
}
void op1(int x,int y,int z)
{
while(topl[x]!=topl[y]){
if(dep[topl[x]]<dep[topl[y]]) swap(x,y);
modify(1,id[topl[x]],id[x],z);
x=fa[topl[x]];
}
if(dep[x]>dep[y]) swap(x,y);
modify(1,id[x],id[y],z);
}
main()
{
ios::sync_with_stdio(0);cin.tie(0),cout.tie(0);
cin>>n;
for(int i=1;i<n;i++){
int u,v;
cin>>u>>v;
u++,v++;
add(u,v);add(v,u);
}
dfs1(1,0);dfs2(1,1);
build(1,1,n);
cin>>m;
while(m--){
char op;
int u,v,d;
cin>>op;
if(op=='A'){
cin>>u>>v>>d;u++,v++;
op1(u,v,d);
}
if(op=='Q'){
cin>>u;u++;
cout<<query(1,u,id[u]+siz[u]-1)<<"\n";
}
}
return 0;
}