题目中只要注意平时在找重儿子的时候是以 s 作为根节点 s>=1 所以在此根节点为 0,要求我们将所有的节点编号 +1
const int N=1e5+5;
int n,m;
int i,j,k;
int a[N];
vector<int> G[N];
struct Node
{
int l, r;
ll lazy,sum;
#define lson id<<1
#define rson id<<1|1
void update(ll x)
{
sum+=x*(r-l+1);
lazy+=x;
}
}t[N<<2];
int fa[N],sz[N],dep[N],son[N];
void dfs1(int u,int f)
{
fa[u]=f;
sz[u]=1;
dep[u]=dep[f]+1;
for(int i=0;i<G[u].size();i++){
int v=G[u][i];
if(v==f) continue;
dfs1(v,u);
sz[u]+=sz[v];
if(sz[v]>sz[son[u]]) son[u]=v;
}
}
int top[N],dfs[N],tree[N],tot=0;
void dfs2(int u,int f)
{
top[u]=f;
dfs[u]=++tot;
tree[tot]=u;
if(!son[u]) return ;
dfs2(son[u],f);
for(int i=0;i<G[u].size();i++){
int v=G[u][i];
if(v==fa[u] || v==son[u]) continue;
dfs2(v,v);
}
}
void push_up(int id){ t[id].sum=t[lson].sum+t[rson].sum; }
void push_down(int id)
{
ll x=t[id].lazy;
if(x){
t[lson].update(x);
t[rson].update(x);
t[id].lazy=0;
}
}
void build(int l,int r,int id)
{
t[id].l=l,t[id].r=r;
t[id].sum=t[id].lazy=0;
if(l==r) return ;
else{
int mid=l+r>>1;
build(l,mid,lson);
build(mid+1,r,rson);
push_up(id);
}
}
void update(int l,int r,int id,ll val)
{
int L=t[id].l,R=t[id].r;
if(L>=l && r>=R) t[id].update(val);
else{
int mid=L+R>>1;
push_down(id);
if(mid>=l) update(l,r,lson,val);
if(r>=mid+1) update(l,r,rson,val);
push_up(id);
}
}
ll query(int l,int r,int id)
{
int L=t[id].l,R=t[id].r;
if(L>=l && r>=R) return t[id].sum;
else{
int mid=L+R>>1;
push_down(id);
ll ans=0;
if(mid>=l) ans+=query(l,r,lson);
if(r>=mid+1) ans+=query(l,r,rson);
push_up(id);
return ans;
}
}
#define nx top[x]
#define ny top[y]
void add(int x,int y,ll z)
{
while(nx!=ny){
if(dep[nx]<dep[ny]) swap(x,y);
update(dfs[nx],dfs[x],1,z);
x=fa[nx];
}
if(dep[x]>dep[y]) swap(x,y);
update(dfs[x],dfs[y],1,z);
}
signed main()
{
while(~sd(n)){
int x,y,z,s=1;
for(int i=1;i<=n-1;i++){
sdd(x,y);
++x,++y;
G[x].pb(y);
G[y].pb(x);
}
dfs1(s,0); dfs2(s,s);
build(1,n,1);
sd(m);
for(int i=1;i<=m;i++){
char opt;
scanf(" %c",&opt);
if(opt=='A'){
sddd(x,y,z);
++x,++y;
add(x,y,z);
} else if(opt=='Q'){
sd(x);
++x;
ll ans=query(dfs[x],dfs[x]+sz[x]-1,1);
pll(ans);
}
}
}
//PAUSE;
return 0;
}