/*
题意:给你含有n个节点的森林,和q次操作,每次操作包含两种情况
1. C a 表示删除a和父亲节点的连边
2. Q a b 表示询问a,b节点是否属于同一个同一棵树中
类型:并查集
分析:要做到删边之后仍然可以找到每棵树的根,那么在合并两个点的时候只
保存父亲节点是谁就行了,然后查找的时候,不断找两个节点的父亲,看
是否存在相等即可
*/
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
const int maxn = 20005;
int n,q,fa[maxn];
int Find(int x){
return x==fa[x]?x:x=Find(fa[x]);
}
void unit(int x,int y){
//x=Find(x);
//y=Find(y);
if(x!=y)fa[x]=y;
}
int main()
{
//freopen("D:\\input.txt","r",stdin);
int t;cin>>t;
int x;
for(int ik=1;ik<=t;ik++){
printf("Case #%d:\n",ik);
scanf("%d%d",&n,&q);
for(int i=0;i<=n;i++){
fa[i]=i;
}
for(int i=1;i<=n;i++){
scanf("%d",&x);
if(x!=0)unit(i,x);
}
for(int i=1;i<=q;i++){
char s[5];int a,b;
scanf("%s",s);
if(s[0]=='C'){
scanf("%d",&a);
fa[a]=a;
}
else{
scanf("%d%d",&a,&b);
if(Find(a)==Find(b))puts("YES");
else puts("NO");
}
}
}
return 0;
}