#include<bits/stdc++.h>
using namespace std;
const int maxn=100010;
int to[maxn*2],nex[maxn*2],beg[maxn],tot;
int fa[maxn],dis[maxn],siz[maxn],son[maxn];
int top[maxn], id[maxn],ran[maxn],cnt;
int Max[maxn<<2];
int n,q;
void add(int x,int y){
to[++tot]=y;
nex[tot]=beg[x];
beg[x]=tot;
}
void dfs1(int rt,int ba){
siz[rt]=1;
dis[rt]=dis[ba]+1;
for(int i=beg[rt];i;i=nex[i]){
int u=to[i];
if(u!=ba){
fa[u]=rt;
dfs1(u,rt);
siz[rt]+=siz[u];
if(siz[u]>siz[son[rt]])son[rt]=u;
}
}
}
void dfs2(int rt,int tp){
top[rt]=tp;
id[++cnt]=rt;
ran[rt]=cnt;
if(son[rt])dfs2(son[rt],tp);
for(int i=beg[rt];i;i=nex[i]){
int u=to[i];
if(u!=son[rt] && u!=fa[rt])
dfs2(u,u);
}
}
void update(int rt,int l,int r,int pos,int x){
if(l==r && l==pos){
Max[rt] +=x;
return;
}
int mid=(l+r)>>1;
if(pos<=mid)
update(rt<<1,l,mid,pos,x);
else
update(rt<<1|1,mid+1,r,pos,x);
Max[rt]=max(Max[rt<<1],Max[rt<<1|1]);
}
int query(int rt,int l,int r,int L ,int R){
if(L<=l && r<=R)
return Max[rt];
else{
int tmp=0;
int mid=(l+r)>>1;
if(L<=mid)
tmp=max(tmp,query(rt<<1,l,mid,L,R));
if(mid+1<=R)
tmp=max(tmp,query(rt<<1|1,mid+1,r,L,R));
return tmp;
}
}
int main(){
cin>>n;
for(int i=1;i<n;i++){
int x,y;
scanf("%d %d",&x,&y);
add(x,y); add(y,x);
}
dfs1(1,0);
dfs2(1,1);
cin>>q;getchar();
for(int i=1;i<=q;i++){
char op;
int x,y;
scanf("%c %d %d",&op,&x,&y);
getchar();
if(op=='I')
update(1,1,n,ran[x],y);
else{
int ans=0;
while(top[x]!=top[y]){
if(dis[top[x]]<dis[top[y]])swap(x,y);
ans=max(ans,query(1,1,n,ran[top[x]],ran[x]));
x=fa[top[x]];
}
if(dis[x]>dis[y])swap(x,y);
ans=max(ans,query(1,1,n,ran[x],ran[y]));
printf("%d\n",ans);
}
}
return 0;
}
#include<bits/stdc++.h>
using namespace std;
const int maxn=100010;
vector<int>a[maxn];
int fa[maxn],dis[maxn],siz[maxn],son[maxn];
int top[maxn], id[maxn],ran[maxn],cnt;
int Max[maxn<<2];
int n,q;
void dfs1(int rt,int ba){
siz[rt]=1;
dis[rt]=dis[ba]+1;
for(int i=0;i<a[rt].size();i++){
int u=a[rt][i];
if(u!=ba){
fa[u]=rt;
dfs1(u,rt);
siz[rt]+=siz[u];
if(siz[u]>siz[son[rt]])son[rt]=u;
}
}
}
void dfs2(int rt,int tp){
top[rt]=tp;
id[++cnt]=rt;
ran[rt]=cnt;
if(son[rt])dfs2(son[rt],tp);
for(int i=0;i<a[rt].size();i++){
int u=a[rt][i];
if(u!=son[rt] && u!=fa[rt])
dfs2(u,u);
}
}
void update(int rt,int l,int r,int pos,int x){
if(l==r && l==pos){
Max[rt] +=x;
return;
}
int mid=(l+r)>>1;
if(pos<=mid)
update(rt<<1,l,mid,pos,x);
else
update(rt<<1|1,mid+1,r,pos,x);
Max[rt]=max(Max[rt<<1],Max[rt<<1|1]);
}
int query(int rt,int l,int r,int L ,int R){
if(L<=l && r<=R)
return Max[rt];
else{
int tmp=0;
int mid=(l+r)>>1;
if(L<=mid)
tmp=max(tmp,query(rt<<1,l,mid,L,R));
if(mid+1<=R)
tmp=max(tmp,query(rt<<1|1,mid+1,r,L,R));
return tmp;
}
}
int main(){
cin>>n;
for(int i=1;i<n;i++){
int x,y;
scanf("%d %d",&x,&y);
a[x].push_back(y);
a[y].push_back(x);
}
dfs1(1,0);
dfs2(1,1);
cin>>q;getchar();
for(int i=1;i<=q;i++){
char op;
int x,y;
scanf("%c %d %d",&op,&x,&y);
getchar();
if(op=='I')
update(1,1,n,ran[x],y);
else{
int ans=0;
while(top[x]!=top[y]){
if(dis[top[x]]<dis[top[y]])swap(x,y);
ans=max(ans,query(1,1,n,ran[top[x]],ran[x]));
x=fa[top[x]];
}
if(dis[x]>dis[y])swap(x,y);
ans=max(ans,query(1,1,n,ran[x],ran[y]));
printf("%d\n",ans);
}
}
return 0;
}