#include #include #include #include using namespace std; const int maxn=100005; struct Edge { int v; Edge *next; }; Edge mem[maxn*2],*G[maxn],*ecnt=mem; inline void AddEdge(int u,int v) { ecnt->v=v; ecnt->next=G[u]; G[u]=ecnt++; } int N,Q; namespace SegmentTree { int mx[maxn<<2]; void update(int o,int l,int r,int p,int v) { if(l==r) { mx[o]=v; return; } int mid=(l+r)>>1; if(p<=mid) update(o<<1,l,mid,p,v); else update(o<<1|1,mid+1,r,p,v); mx[o]=max(mx[o<<1],mx[o<<1|1]); } int query(int o,int l,int r,int a,int b) { if(a<=l&&r<=b) return mx[o]; int mid=(l+r)>>1,res=0; if(a<=mid) res=max(res,query(o<<1,l,mid,a,b)); if(midnext) { if(it->v==f) continue; dfs1(it->v,u,d+1); sz[u]+=sz[it->v]; if(sz[it->v]>sz[son[u]]) son[u]=it->v; } } void dfs2(int u,int t) { assert(!id[u]); id[u]=++dfn; top[u]=t; rk[id[u]]=u; if(!son[u]) return; dfs2(son[u],t); for(Edge *it=G[u];it;it=it->next) { if(it->v==son[u]||it->v==fa[u]) continue; dfs2(it->v,it->v); } } int solve(int x) { int maxid=0; while(x!=-1) { // printf("x=%d top[x]=%d id[x]=%d id[top[x]]=%d\n",x,top[x],id[x],id[top[x]]); maxid=max(maxid,SegmentTree::query(1,1,N,id[top[x]],id[x])); x=fa[top[x]]; if(maxid) return rk[maxid]; } return rk[maxid]; } int main() { #ifdef local freopen("pro.in","r",stdin); #endif scanf("%d%d",&N,&Q); for(int i=0;i0) { char opt; int x; scanf("%s %d",&opt,&x); // printf("%c %d\n",opt,x); if(opt=='C') SegmentTree::update(1,1,N,id[x],id[x]); else printf("%d\n",solve(x)); } return 0; }