#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn = 1e5 + 5;
const int maxm = maxn << 1;
///图(链式前向星出了点问题)
vector<int> g[maxm];
///线段树
struct node{
int l, r, len;
ll sum, lazy;
int mid(){
return (l + r) >> 1;
}
}tree[maxn << 2];
///全局变量
int fa[maxn], dep[maxn], siz[maxn], son[maxn];///dfs1
int tim, dfn[maxn], top[maxn], w[maxn], val[maxn];///dfs2
void dfs1(int u, int f){
fa[u] = f;
dep[u] = dep[f] + 1;
siz[u] = 1;
int maxsize = -1;
for(int i = 0; i < g[u].size(); i++){
int v = g[u][i];
if(v == f) continue;
dfs1(v, u);
siz[u] += siz[v];
if(siz[v] > maxsize){
maxsize = siz[v];
son[u] = v;
}
}
}
void dfs2(int u, int t){
dfn[u] = ++tim;
top[u] = t;
w[tim] = u;
if(!son[u]) return;
dfs2(son[u], t);
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);
}
}
inline void PushDown(int root){
if(tree[root].lazy){
tree[root << 1].lazy += tree[root].lazy;
tree[root << 1 | 1].lazy += tree[root].lazy;
tree[root << 1].sum += tree[root].lazy * tree[root << 1].len;
tree[root << 1 | 1].sum += tree[root].lazy * tree[root << 1 | 1].len;
tree[root].lazy = 0;
}
}
inline void PushUp(int root){
tree[root].sum = tree[root << 1].sum + tree[root << 1 | 1].sum;
}
void Build(int root, int l, int r){
tree[root].len = r - l + 1;
tree[root].lazy = 0;
tree[root].sum = 0;
tree[root].l = l;
tree[root].r = r;
if(l == r){
tree[root].sum = val[w[l]];
return;
}
int mid = tree[root].mid();
Build(root << 1, l, mid);
Build(root << 1 | 1, mid + 1, r);
PushUp(root);
}
void UpDate(int root, int l, int r, int c){
if(tree[root].l >= l && r >= tree[root].r){
tree[root].lazy += c;
tree[root].sum += c * tree[root].len;
return;
}
if(tree[root].l == tree[root].r) return;
PushDown(root);
int mid = tree[root].mid();
if(r <= mid) UpDate(root << 1, l, r, c);
else if(l > mid) UpDate(root << 1 | 1, l, r, c);
else{
UpDate(root << 1, l, mid, c);
UpDate(root << 1 | 1, mid + 1, r, c);
}
PushUp(root);
}
ll Query(int root, int l, int r){
if(tree[root].l >= l && r >= tree[root].r) return tree[root].sum;
PushDown(root);
int mid = tree[root].mid();
if(r <= mid) return Query(root << 1, l, r);
else if(l > mid) return Query(root << 1 | 1, l, r);
else return Query(root << 1, l, mid) + Query(root << 1 | 1, mid + 1, r);
}
inline void mson(int x, int z){
UpDate(1, dfn[x], dfn[x] + siz[x] - 1, z);
}
inline ll qson(int x){
return Query(1, dfn[x], dfn[x] + siz[x] - 1);
}
inline void ChangeLink(int x, int y, int z){
while(top[x] != top[y]){
if(dep[top[x]] < dep[top[y]]) swap(x, y);
UpDate(1, dfn[top[x]], dfn[x], z);
x = fa[top[x]];
}
if(dep[x] > dep[y]) swap(x, y);
UpDate(1, dfn[x], dfn[y], z);
}
inline ll QueryLink(int x, int y){
ll res = 0;
while(top[x] != top[y]){
if(dep[top[x]] < dep[top[y]]) swap(x, y);
res += Query(1, dfn[top[x]], dfn[x]);
x = fa[top[x]];
}
if(dep[x] > dep[y]) swap(x, y);
res += Query(1, dfn[x], dfn[y]);
return res;
}
int main(){
int n, u, v, x, y, z, m;
char s[10];
scanf("%d", &n);
for(int i = 1; i < n; i++){
scanf("%d%d", &u, &v);
g[u + 1].push_back(v + 1);
g[v + 1].push_back(u + 1);
}
dfs1(1, 0);
dfs2(1, 1);
Build(1, 1, tim);
scanf("%d", &m);
getchar();
for(int i = 1; i <= m; i++){
scanf("%s", s);
if(s[0] == 'A'){
scanf("%d%d%d", &x, &y, &z);
ChangeLink(x + 1, y + 1, z);
}
else{
scanf("%d", &x);
printf("%lld\n", qson(x + 1));
}
}
return 0;
}