#include <bits/stdc++.h>
using namespace std;
void fre() {
  freopen("test.in", "r", stdin);
  freopen("test.out", "w", stdout);
}
void fc() {
  fclose(stdin);
  fclose(stdout);
}
inline long long ccin() {
  long long x = 0, f = 1;
  char ch = getchar();
  while (ch < '0' || ch > '9') {
    if (ch == '-') f = -1;
    ch = getchar();
  }
  while (ch >= '0' && ch <= '9') x = x * 10 + ch - '0', ch = getchar();
  return x * f;
}
inline void cou(long long x) {
  if (x < 0) putchar('-'), x = -x;
  if (x > 9) cou(x / 10);
  putchar(x % 10 + '0');
}
const int maxn = 5e5 + 10;
const long long inf = 0x7fffffff;
int n, m;
struct node {
  int fat;
  int dep;
  int siz;
  int zson;
  int id;
} all[maxn];
char yuan[maxn];
bool ans[maxn];
int dfsn[maxn], tot;
struct ren {
  int shen;
  int xu;
};
vector<ren> allr[maxn];
vector<int> side[maxn];
int cnt[maxn][30];
void add1(int u, int v) { side[u].push_back(v); }
void dfs(int now) {
  all[now].siz = 1;
  all[now].id = ++tot;
  dfsn[tot] = now;
  for (int i = 0; i < side[now].size(); i++) {
    int v = side[now][i];
    if (all[v].dep) continue;
    all[v].dep = all[now].dep + 1;
    all[v].fat = now;
    dfs(v);
    all[now].siz += all[v].siz;
    if (all[v].siz >= all[all[now].zson].siz) all[now].zson = v;
  }
}
bool check(int now) {
  int res = 0;
  for (int i = 1; i <= 26; i++) {
    if (cnt[now][i] % 2 == 1) res++;
  }
  return (res > 1) ? 0 : 1;
}
void add(int now) { cnt[all[now].dep][yuan[now]]++; }
void upd(int now) {
  for (int i = all[now].id; i <= all[now].id + all[now].siz - 1; i++)
    add(dfsn[i]);
}
void del(int now) { cnt[all[now].dep][yuan[now]] = 0; }
void erase(int now) {
  for (int i = all[now].id; i <= all[now].id + all[now].siz - 1; i++)
    del(dfsn[i]);
}
void dfs2(int now, int ifz) {
  for (int i = 0; i < side[now].size(); i++) {
    int v = side[now][i];
    if (v == all[now].zson || v == all[now].fat) continue;
    dfs2(v, 0);
  }
  if (all[now].zson) dfs2(all[now].zson, 1);
  for (int i = 0; i < side[now].size(); i++) {
    int v = side[now][i];
    if (v == all[now].zson || v == all[now].fat) continue;
    upd(v);
  }
  add(now);
  for (int i = 0; i < allr[now].size(); i++) {
    ans[allr[now][i].xu] = check(allr[now][i].shen);
  }
  if (ifz) return;
  erase(now);
}
int main() {
  ios::sync_with_stdio(0);
  cin.tie(0);
  cout.tie(0);
  ;
  cin >> n >> m;
  for (int i = 1; i < n; i++) {
    int v;
    cin >> v;
    add1(i + 1, v);
    add1(v, i + 1);
    all[i + 1].fat = v;
  }
  string a1;
  cin >> a1;
  for (int i = 1; i <= n; i++) yuan[i] = a1[i - 1] - 'a' + 1;
  for (int i = 1; i <= m; i++) {
    int u, v;
    cin >> u >> v;
    allr[u].push_back((ren){v, i});
  }
  all[1].dep = 1;
  dfs(1);
  dfs2(1, 0);
  for (int i = 1; i <= m; i++) {
    if (ans[i])
      cout << "Yes\n";
    else
      cout << "No\n";
  }
  return 0;
}
