#include <bits/stdc++.h>
using namespace std;
namespace Debug {
template <typename Ty>
inline void _debug(const char* f, Ty t) {
  cerr << f << '=' << t << endl;
}
template <typename Ty, typename... Ar>
inline void _debug(const char* f, Ty x, Ar... y) {
  while (*f != ',') cerr << *f++;
  cerr << '=' << x << ",";
  _debug(f + 1, y...);
}
template <typename Ty>
ostream& operator<<(ostream& os, const vector<Ty>& V) {
  os << "[";
  for (const auto& vv : V) os << vv << ",";
  os << "]";
  return os;
}
}  // namespace Debug
using namespace Debug;
namespace FastIO {
template <typename Ty>
inline void read(Ty& x) {
  char c;
  int f = 1;
  x = 0;
  while (!isdigit(c = getchar())) f = c ^ '-' ? 1 : -1;
  while (x = (x << 3) + (x << 1) + (c & 15), isdigit(c = getchar()))
    ;
  x *= f;
}
template <typename Ty, typename... Ar>
inline void read(Ty& x, Ar&... y) {
  read(x), read(y...);
}
template <typename Ty>
inline void write(Ty x) {
  x < 0 && (putchar(('-')), x = -x, 0),
      x < 10 ? (putchar((x + '0')), 0)
             : (write(x / 10), putchar((x % 10 + '0')), 0);
}
template <typename Ty>
inline void writeln(const Ty& x) {
  write(x), putchar(('\n'));
}
}  // namespace FastIO
using namespace FastIO;
const int N = 5e5 + 10;
int n, m, Ans[N], F[N];
char a[N];
vector<pair<int, int> > q[N];
vector<int> v[N], t[N];
inline void Dfs(const int& x, const int& d) {
  F[d] ^= 1 << (a[x] - 'a');
  for (auto i : q[x]) t[x].push_back(F[i.first]);
  for (auto i : v[x]) Dfs(i, d + 1);
  for (register int i = 0; i < q[x].size(); i++)
    Ans[q[x][i].second] = (t[x][i] ^ F[q[x][i].first]);
}
int main() {
  register int i, x, y;
  for (read(n, m), i = 2; i <= n; i++) read(x), v[x].push_back(i);
  for (i = 1; i <= n; i++) cin >> a[i];
  for (i = 1; i <= m; i++) read(x, y), q[x].push_back(make_pair(y, i));
  for (Dfs(1, 1), i = 1; i <= m; i++)
    puts(Ans[i] == (Ans[i] & -Ans[i]) ? "Yes" : "No");
  return 0;
}
