#include<bits/stdc++.h>
#define yes cout<<"YES\n"
#define no cout<<"NO\n"
#define pb push_back
using namespace std;
typedef long long LL;
typedef pair<LL,LL> PII;
const LL N=1e5+5;
LL n,q,dfn[N],siz[N],dep[N],idx;
vector<LL>g[N];
struct SegNode{
LL l,r;
PII ma,tag;
}tr[N<<2];
void dfs(LL u,LL fa){
dfn[u]=++idx;
siz[u]=1;
dep[u]=dep[fa]+1;
for(auto v:g[u]){
if(v==fa) continue;
dfs(v,u);
siz[u]+=siz[v];
}
}
inline LL lc(LL rt){return rt<<1;}
inline LL rc(LL rt){return (rt<<1)|1;}
inline void pushup(LL rt){
tr[rt].ma=max(tr[lc(rt)].ma,tr[rc(rt)].ma);
}
inline void pushdown(LL rt){
tr[lc(rt)].ma=max(tr[lc(rt)].ma,tr[rt].tag);
tr[rc(rt)].ma=max(tr[rc(rt)].ma,tr[rt].tag);
tr[rt].tag={0,0};
}
void build(LL rt,LL L,LL R){
tr[rt]={L,R,{1,1},{0,0}};
if(L==R) return;
LL mid=(L+R)>>1;
build(lc(rt),L,mid);
build(rc(rt),mid+1,R);
}
void update(LL rt,LL L,LL R,PII val){
if(tr[rt].l>=L&&tr[rt].r<=R){
tr[rt].ma=max(tr[rt].ma,val);
tr[rt].tag=max(tr[rt].tag,val);
return;
}
pushdown(rt);
LL mid=(tr[rt].l+tr[rt].r)>>1;
if(R<=mid){
update(lc(rt),L,R,val);
}else if(L>mid){
update(rc(rt),L,R,val);
}else{
update(lc(rt),L,mid,val);
update(rc(rt),mid+1,R,val);
}
pushup(rt);
}
PII query(LL rt,LL pos){
if(tr[rt].l==tr[rt].r){
return tr[rt].ma;
}
pushdown(rt);
LL mid=(tr[rt].l+tr[rt].r)>>1;
if(pos<=mid){
return query(lc(rt),pos);
}else{
return query(rc(rt),pos);
}
}
bitset<N>vis;
int main(){
ios::sync_with_stdio(false);
cin.tie(0);cout.tie(0);
cin>>n>>q;
for(LL i=1,u,v;i<n;i++){
cin>>u>>v;
g[u].pb(v),g[v].pb(u);
}
dfs(1,0);
build(1,1,n);
vis[1]=1;
while(q--){
char op;LL x;cin>>op>>x;
if(op=='C'){
if(vis[x]){
continue;
}
vis[x]=1;
update(1,dfn[x],dfn[x]+siz[x]-1,{dep[x],x});
}else{
cout<<query(1,dfn[x]).second<<"\n";
}
}
return 0;
}
/*
*/
悬2关