#include<bits/stdc++.h>
using namespace std;
const int N = 5e5 + 5;
int n, m, heavy;
int siz[N], son[N], c[N], fa[N], sum[N][30], dep[N], SON[N];
bool ans[N];
char s[N];
vector<int> nbr[N];
struct Query {
int id, b;
};
vector<Query> q[N];
bool check(int x)
{
int cnt = 0;
for(int i = 0; i < 26; i++)
cnt += (sum[x][i] & 1);
return cnt <= 1;
}
void pre_son(int cur, int fa)
{
dep[cur] = dep[fa] + 1;
siz[cur] = 1;
for(auto nxt : nbr[cur]) if(nxt != fa)
{
pre_son(nxt, cur);
siz[cur] += siz[nxt];
if(siz[nxt] > siz[son[cur]])
son[cur] = SON[cur] = nxt;
}
}
void update(int cur, int fa, int val)
{
sum[dep[cur]][s[cur] - 'a'] += val;
for(auto nxt : nbr[cur]) if(nxt != fa)
{
if(nxt == heavy) continue;
update(nxt, cur, val);
}
}
void dfs(int cur, int fa, bool big)
{
for(auto nxt : nbr[cur]) if(nxt != fa)
{
if(nxt == son[cur]) continue;
dfs(nxt, cur, 0);
}
if(son[cur])
{
dfs(son[cur], cur, 1);
heavy = son[cur];
}
update(cur, fa, 1);
for(auto Q : q[cur])
ans[Q.id] = check(Q.b);
heavy = 0;
if(!big) update(cur, fa, -1);
}
int main()
{
cin.tie(0) -> sync_with_stdio(0);
cin >> n >> m;
for(int i = 1; i < n; i++)
{
int u = i, v; cin >> v;
nbr[u].push_back(v);
nbr[v].push_back(u);
}
for(int i = 1; i <= n; i++)
cin >> s[i];
for(int i = 1; i <= m; i++)
{
int a, b; cin >> a >> b;
q[a].push_back((Query){i, b});
}
pre_son(1, 0);
dfs(1, 0, 0);
for(int i = 1; i <= m; i++)
cout << (ans[i] == false ? "No" : "Yes") << "\n";
return 0;
}