#include<bits/stdc++.h>
using namespace std;
int n,m;
int h[1000005],to[1000005],nxt[1000005],cnt=0,ct=0;
string s;
void add(int x,int y)
{
to[++cnt]=y;
nxt[cnt]=h[x];
h[x]=cnt;
}
long long ans[1000005],ap[1000005],maxx=0,sum=0,k;
int sz[1000005],son[1000005],col[1000005],tot[1000005][30],vis[1000005],heason[1000005],d[1000005],f[1000005];
struct node
{
int id;
int num;
};
vector<node> q[1000005];
bool check(int s[])
{
int res=0;
for(int i=1;i<=26;i++)res+=(s[i]&1);
if(res<=1)return true;
else return false;
}
void dfs1(int x,int fa)
{
sz[x]=1;
d[x]=d[fa]+1;
for(int i=h[x];i;i=nxt[i])
{
int y=to[i];
if(y==fa)continue;
dfs1(y,x);
sz[x]+=sz[y];
if(heason[x]==0||sz[heason[x]]<sz[y])
{
heason[x]=y;
}
}
}
void dfs2(int x,int fa,int c)
{
tot[d[x]][s[x]-'a'+1]+=c;
for(int i=h[x];i;i=nxt[i])
{
int y=to[i];
if(y==fa||vis[y])continue;
dfs2(y,x,c);
}
}
void dfs3(int x,int fa,bool bj)
{
for(int i=h[x];i;i=nxt[i])
{
int y=to[i];
if(y==fa||y==heason[x])continue;
dfs3(y,x,1);
}
if(heason[x])
{
dfs3(heason[x],x,0);
vis[heason[x]]=1;
}
dfs2(x,fa,1);
for(int i=0;i<q[x].size();i++)
{
ans[q[x][i].id]=check(tot[q[x][i].num]);
}
if(heason[x])vis[heason[x]]=1;
if(bj)dfs2(x,fa,-1);
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
cin>>n>>m;
for(int i=2;i<=n;i++)
{
int x;
cin>>x;
add(x,i);
add(i,x);
}
cin>>s;
s=" "+s;
for(int i=1;i<=m;i++)
{
int u;
cin>>u>>k;
q[u].push_back((node){i,k});
}
dfs1(1,0);
dfs3(1,0,1);
for(int i=1;i<=m;i++)
{
if(ans[i]==1)cout<<"Yes\n";
else cout<<"No\n";
}
return 0;
}
/*
5 6
1 1 2 3
cbcab
3 1
5 2
1 3
4 1
4 2
1 1
*/