记录
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int maxn=1e5;
char opt;
int n,fa[maxn+5],top[maxn+5],size[maxn+5],son[maxn+5],dept[maxn+5],ys[maxn+5],a,b,tot,x,y,z;
vector <int> rood[maxn+5];
struct node{
int lef,rig,sum,add;
}tree[maxn<<2|1];
void dfs1(int now,int fat){
fa[now]=fat;
dept[now]=dept[fat]+1;
size[now]=1;
for(int i=0;i<rood[now].size();i++){
int to=rood[now][i];
if(to==fat)continue;
dfs1(to,now);
size[now]+=size[to];
if(size[son[now]]<=size[to])son[now]=to;
}
}
void dfs2(int now,int topf){
ys[now]=++tot;
top[now]=topf;
if(!son[now])return;
dfs2(son[now],now);
for(int i=0;i<rood[now].size();i++){
int to=rood[now][i];
if(top[to])continue;
dfs2(to,to);
}
}
void pushup(int now){
tree[now].sum=tree[now<<1].sum+tree[now<<1|1].sum;
}
void pushdown(int now){
if(tree[now].add){
tree[now<<1].add+=tree[now].add;
tree[now<<1|1].add+=tree[now].add;
tree[now<<1].sum+=tree[now].add*(tree[now<<1].rig-tree[now<<1].lef+1);
tree[now<<1|1].sum+=tree[now].add*(tree[now<<1|1].rig-tree[now<<1|1].lef+1);
tree[now].add=0;
}
}
void build(int now,int lef,int rig){
tree[now].lef=lef,tree[now].rig=rig;
if(lef==rig){
return;
}
int mid=lef+rig>>1;
build(now<<1,lef,mid);
build(now<<1|1,mid+1,rig);
}
void modify(int now,int lef,int rig,int add){
if(lef<=tree[now].lef&&tree[now].rig<=rig){
tree[now].add+=add;
tree[now].sum+=add*(tree[now].rig-tree[now].lef+1);
return;
}
pushdown(now);
int mid=tree[now].lef+tree[now].rig>>1;
if(lef<=mid)modify(now<<1,lef,rig,add);
if(mid<rig)modify(now<<1|1,lef,rig,add);
pushup(now);
}
int query(int now,int lef,int rig){
if(lef<=tree[now].lef&&tree[now].rig<=rig){
return tree[now].sum;
}
pushdown(now);
int mid=tree[now].lef+tree[now].rig>>1;
int res=0;
if(lef<=mid)res=query(now<<1,lef,rig);
if(mid<rig)res+=query(now<<1|1,lef,rig);
return res;
}
void tree_modify(int x,int y,int add){
while(top[x]!=top[y]){
if(dept[top[x]]<dept[top[y]])swap(x,y);
modify(1,ys[top[x]],ys[x],add);
x=fa[top[x]];
}
if(dept[x]>dept[y])swap(x,y);
modify(1,ys[x],ys[y],add);
}
signed main(){
cin>>n;
for(int i=1;i<n;i++){
scanf("%lld%lld",&a,&b);
++a,++b;
rood[a].push_back(b);
rood[b].push_back(a);
}
dfs1(1,0);
dfs2(1,1);
build(1,1,tot);
cin>>n;
while(n--){
cin>>opt;
scanf("%lld",&x);
++x;
if(opt=='Q'){
printf("%lld\n",query(1,ys[x],ys[x]+size[x]-1));
}else{
cin>>y>>z;
++y;
tree_modify(x,y,z);
}
}
return 0;
}