#include<bits/stdc++.h>
using namespace std;
#define RI register int
const int MAXN=3e5+1;
int cnt,cont;
int N,M;
vector<int> dian[MAXN];
int dad[MAXN],son[MAXN],siz[MAXN],dep[MAXN];
int d[MAXN];
int top[MAXN],id[MAXN];
int data[MAXN<<2];
int xx[MAXN],yy[MAXN];
inline void Add(int x,int y){
dian[x].push_back(y);
}
namespace segment_tree{
inline int ls(int n){
return n<<1;
}
inline int rs(int n){
return n<<1|1;
}
inline void push_up(int n){
data[n]=max(data[ls(n)],data[rs(n)]);
}
inline void upd(int ud,int l,int r,int k,int now){
if(l==r){
data[now]=k;
return ;
}
int mid=(l+r)>>1;
if(ud<=mid)upd(ud,l,mid,k,ls(now));
else upd(ud,mid+1,r,k,rs(now));
push_up(now);
}
inline int query(int ql,int qr,int l,int r,int now){
if(ql<=l&&r<=qr)
return data[now];
int mid=(l+r)>>1;
int ans=0;
if(ql<=mid)ans=max(ans,query(ql,qr,l,mid,ls(now)));
if(qr>mid)ans=max(ans,query(ql,qr,mid+1,r,rs(now)));
return ans;
}
}using namespace segment_tree;
namespace pou_tree{
inline void dfs1(int now,int fa){
dep[now]=dep[fa]+1;
dad[now]=fa;
siz[now]=1;
int maxson=-1;
for(RI i=0;i<dian[now].size();i++){
int nx=dian[now][i];
if(nx==fa)continue ;
dfs1(nx,now);
siz[now]+=siz[nx];
if(maxson<siz[nx])maxson=siz[nx],son[now]=nx;
}
}
inline void dfs2(int now,int topf){
id[now]=++cnt;
top[now]=topf;
if(!son[now])return ;
dfs2(son[now],topf);
for(RI i=0;i<dian[now].size();i++){
int nx=dian[now][i];
if(nx==son[now]||nx==dad[now])continue ;
dfs2(nx,nx);
}
}
inline int query_lj(int x,int y){
while(top[x]!=top[y]){
if(dep[top[x]]<dep[top[y]])swap(x,y);
if(query(id[top[x]],id[x],1,N,1)==1)return 0;
x=dad[top[x]];
}
if(x==y)return 1;
if(query(min(id[x],id[y])+1,max(id[x],id[y]),1,N,1)==1)return 0;
return 1;
}
}using namespace pou_tree;
signed main(){
scanf("%d%d",&N,&M);
int u,v;
for(RI i=1;i<N;i++){
scanf("%d%d",&u,&v);
Add(u,v);
Add(v,u);
}
dfs1(1,1);
dfs2(1,1);
char opt[1];
int x,y;
while(M--){
scanf("%s",opt);
if(opt[0]=='Q') {
scanf("%d%d",&x,&y);
if(query_lj(x,y))printf("Yes\n");
else printf("No\n");
}
else if(opt[0]=='C'){
scanf("%d%d",&xx[++cont],&yy[cont]);
upd(max(id[xx[cont]],id[yy[cont]]),1,N,1,1);
}
else {
scanf("%d",&x);
upd(max(id[xx[x]],id[yy[x]]),1,N,0,1);
}
}
return 0;
}
卡了几个小时了。。。