#include<bits/stdc++.h>
using namespace std;
#define Mid ((l+r)>>1)
#define lson rt<<1,l,Mid
#define rson rt<<1|1,Mid+1,r
const int maxn=100000+10;
int to[maxn*2],nex[maxn*2],beg[maxn];
int fa[maxn],dis[maxn],siz[maxn],son[maxn],top[maxn];
int id[maxn],ran[maxn];
int Max[maxn*4];
int n,q,s,cnt,tot;
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 num){
if(l == r && r == pos){
Max[rt] += num;
}else{
if( pos <= Mid)
update(lson,pos,num);
if( pos > Mid)
update(rson,pos,num);
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;
if( L <= Mid)
tmp = max(tmp,query(lson,L,R));
if( R > Mid)
tmp = max(tmp,query(rson,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++){
int x,y;
char o;
scanf("%c %d %d",&o,&x,&y);
getchar();
if(o=='G'){
int u=x,v=y;
int ans=0;
while(top[u]!=top[v]){
if(dis[top[u]]<dis[top[v]]){
int tmp=u; u=v; v=tmp;
}
ans = max(ans,query(1,1,n,ran[top[u]],ran[u]));
u=fa[top[u]];
}
if(dis[u]<dis[v]){
int tmp=u; u=v; v=tmp;
}
ans = max(ans,query(1,1,n,ran[v],ran[u]));
printf("%d\n",ans);
}else{
update(1,1,n,ran[x],y);
}
}
return 0;
}