#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <climits>
#include <ctime>
#define _max(_a_,_b_) ((_a_)>(_b_)?(_a_):(_b_))
#ifdef ONLINE_JUDGE
char __B[1<<15],*__S=__B,*__T=__B;
#define getchar() (__S==__T&&(__T=(__S=__B)+fread(__B,1,1<<15,stdin),__S==__T)?EOF:*__S++)
#endif
inline int getnum()
{
register char c=0;
while(!(c>='0' && c<='9'))
c=getchar();
register int a=0;
while(c>='0' && c<='9')
a=a*10+c-'0',c=getchar();
return a;
}
int a[255050],wN,w[250505];
#define _lowbit(_x) ((_x)&-(_x))
int N,f[250505];
inline void updatef(register int pos,const int&val)
{
while(pos<=N)
f[pos]^=val,pos+=_lowbit(pos);
}
inline int queryf(register int pos)
{
register int ans=0;
while(pos)
ans^=f[pos],pos-=_lowbit(pos);
return ans;
}
int gcnt,ghead[250505],gnext[505050],gnode[505050];
inline void InsertLine(register int s,register int t)
{
gnext[++gcnt]=ghead[s],ghead[s]=gcnt,gnode[gcnt]=t;
gnext[++gcnt]=ghead[t],ghead[t]=gcnt,gnode[gcnt]=s;
}
int depth[250505],father[250505],size[250505],son[250505],top[250505];
void DFS0(register int o)
{
size[o]=1;
for(register int j=ghead[o],t;j;j=gnext[j])
if((t=gnode[j]) != father[o])
{
depth[t]=depth[o]+1,father[t]=o;
DFS0(t);
size[o]+=size[t];
(size[t]>size[son[o]] ? son[o]=t : 0);
}
}
int dfcnt,dfn[250505];
void DFS1(register int o)
{
dfn[o]=++dfcnt;
if(o==son[father[o]])
top[o]=top[father[o]];
else
top[o]=o;
for(register int j=ghead[o],t;j;j=gnext[j])
if((t=gnode[j]) != father[o])
DFS1(t);
updatef(dfn[o],w[a[o]]),updatef(dfn[o]+size[o],w[a[o]]);
}
inline int GetLCA(register int x,register int y)
{
while(top[x] != top[y])
if(depth[top[x]] > depth[top[y]])
x=father[top[x]];
else
y=father[top[y]];
return (depth[x]<depth[y] ? x : y);
}
int pxw[250505];
int main()
{
srand(time(NULL));
register int _T=getnum(),mxa=0;
while(_T--)
{
register int N=getnum(),Q=getnum();
::N=N;
for(register int i=1;i<=N;i++)
a[i]=getnum(),mxa=_max(mxa,a[i]);
for(register int i=wN+1;i<=mxa;i++)
w[i]=rand(),pxw[i]=pxw[i-1]^w[i];
wN=_max(wN,mxa);
gcnt=0,memset(ghead,0,sizeof(ghead));
for(register int i=1;i<=N-1;i++)
InsertLine(getnum(),getnum());
dfcnt=0,memset(son,0,sizeof(son));
memset(f,0,sizeof(f));
DFS0(1),DFS1(1);
for(register int lp=1;lp<=Q;lp++)
{
register int tp=getnum(),x=getnum(),y=getnum();
if(tp==1)
{
register int lca=GetLCA(x,y);
register int ans=queryf(dfn[x])^queryf(dfn[y])^w[a[lca]];
if(ans==pxw[depth[x]+depth[y]-(depth[lca]<<1)+1])
putchar('Y'),putchar('e'),putchar('s');
else
putchar('N'),putchar('o');
putchar('\n');
}
else
{
updatef(dfn[x],w[a[x]]),updatef(dfn[x]+size[x],w[a[x]]);
a[x]=y;
updatef(dfn[x],w[a[x]]),updatef(dfn[x]+size[x],w[a[x]]);
}
}
}
return 0;
}