#include<bits/stdc++.h>
using namespace std;
const int N = 1e5+10;
int n,q;
int tot,h[N];
long long d[N],fa[N],son[N],id[N],siz[N],top[N],dfsid;
struct tree{
int l,r;
long long val,tag;
}t[N*4];
struct edge{
int u,v,nxt;
}e[N*2];
inline void add(int u,int v){
e[++tot].u = u;
e[tot].v = v;
e[tot].nxt = h[u];
h[u] = tot;
}
inline void push_up(int p){
t[p].val = t[p<<1].val + t[p<<1|1].val;
}
inline void push_down(int p){
if(t[p].tag){
t[p<<1].tag += t[p].tag;
t[p<<1|1].tag += t[p].tag;
t[p<<1].val += t[p].tag * (t[p<<1].r - t[p<<1].l + 1);
t[p<<1|1].val += t[p].tag * (t[p<<1|1].r - t[p<<1|1].l + 1);
}
}
void build(int p,int l,int r){
t[p].l = l,t[p].r = r;
if(l == r)return;
int mid = (l + r) >> 1;
build(p<<1,l,mid);
build(p<<1|1,mid+1,r);
push_up(p);
}
inline void update(int p,int l,int r,long long val){
if(t[p].l >= l && t[p].r <= r){
t[p].tag += val;
t[p].val += val * (t[p].r - t[p].l + 1);
return ;
}
push_down(p);
int mid = (t[p].l + t[p].r) >> 1;
if(l <= mid) update(p<<1,l,r,val);
if(r > mid) update(p<<1|1,l,r,val);
push_up(p);
}
inline long long query(int p,int l,int r){
if(t[p].l >= l && t[p].r <= r)return t[p].val;
int mid = (t[p].l + t[p].r) >> 1;
long long res = 0;
push_down(p);
if(l <= mid)res += query(p<<1,l,r);
if(r > mid)res += query(p<<1|1,l,r);
return res;
}
void dfs1(int u,int f){
d[u] = d[f] + 1;
fa[u] = f;
siz[u] = 1;
for(int i = h[u];i;i = e[i].nxt){
int v = e[i].v;
if(v == f)continue;
dfs1(v,u);
siz[u] += siz[v];
if(!son[u] || siz[son[u]] < siz[v])son[u] = v;
}
}
void dfs2(int u,int topx){
top[u] = topx;
id[u] = ++ dfsid;
if(! son[u])return;
dfs2(son[u],topx);
for(int i = h[u];i;i = e[i].nxt){
int v = e[i].v;
if(v != fa[u] && son[u] != v)dfs2(v,v);
}
}
inline void change(int l,int r,long long val){
while(top[l] != top[r]){
if(d[top[l]] < d[top[r]])swap(l,r);
update(1,id[top[l]],id[l],val);
l = fa[top[l]];
}
if(d[l] > d[r])swap(l,r);
update(1,id[l],id[r],val);
}
int main(){
cin >> n;
for(int i = 1;i < n;i ++){
int u,v;
cin >> u >> v;
add(u+1,v+1);
add(v+1,u+1);
}
dfs1(1,0);
dfs2(1,1);
build(1,1,n);
cin >> q;
while(q --){
// cout << "x" << endl;
char opt;
cin >> opt;
if(opt == 'A'){
int u,v;
long long k;
cin >> u >> v >> k;
change(id[u+1],id[v+1],k);
}else{
int x;
cin >> x;
cout << query(1,id[x+1],id[x+1]+siz[x+1]-1) << endl;
}
}
return 0;
}
就算全开long log第一个点也输出-
Orz,ty