#include<bits/stdc++.h>
using namespace std;
namespace Fread{
const int SIZE=1<<8;
char buf[SIZE],*S,*T;
inline char getchar(){
if(S==T){
T=(S=buf)+fread(buf,1,SIZE,stdin);
if(S==T)return '\n';
}return *S++;
}
}
namespace Fwrite{
const int SIZE=1<<8;
char buf[SIZE],*S=buf,*T=buf+SIZE;
inline void flush(){fwrite(buf,1,S-buf,stdout);S=buf;}
inline void putchar(char c){
*S++=c;if(S==T)flush();
}
struct HuiHe{~HuiHe(){flush();}}GreyCrane;
}
#define getchar Fread::getchar
#define putchar Fwrite::putchar
template<typename T>inline void read(T&x){
x=0;T f=1;
char c=getchar();
while(!isdigit(c)){if(c=='-')f=-f;c=getchar();}
while(isdigit(c))x=x*10+(c^48),c=getchar();
x*=f;
}
inline void read(string&s){
s="";char c=getchar();
while(c==' '||c=='\n'||c=='\r')c=getchar();
while(c!=' '&&c!='\n'&&c!='\r')s+=c,c=getchar();
}
template<typename T>inline void write(T x){
if(x==0){putchar(48);return ;}
if(x<0)putchar('-'),x=-x;
static int sta[45];int top=0;
while(x)sta[++top]=x%10,x/=10;
while(top)putchar(sta[top--]+48);
}
inline void write(char c){putchar(c);}
inline void write(char*s){int len=strlen(s);for(int i=0;i<len;i++)putchar(s[i]);}
inline void write(const char*s){int len=strlen(s);for(int i=0;i<len;i++)putchar(s[i]);}
inline void write(string s){for(auto x:s)putchar(x);}
#define all(x) x.begin(),x.end()
#define siz(x) ((int)x.size())
#define pb push_back
#define fi first
#define se second
#define edl putchar('\n')
const int N=5e5+5;
int n,m;
string s;
vector<int>e[N];
int dep[N],Maxdep;
inline void dfs(int x){
Maxdep=max(Maxdep,dep[x]);
for(auto y:e[x]){
dep[y]=dep[x]+1;
dfs(y);
}
}
vector<pair<int,int>>q[N];
int sum[N<<5],lp[N<<5],rp[N<<5],cnt;
inline void pushup(int p){sum[p]=sum[lp[p]]+sum[rp[p]];}
inline void modify(int&p,int x,int k,int l,int r){
if(!p)p=++cnt;
if(x==l&&x==r){
sum[p]^=k;
return ;
}
int mid=(l+r)>>1;
if(x<=mid)modify(lp[p],x,k,l,mid);
else modify(rp[p],x,k,mid+1,r);
pushup(p);
}
inline int query(int p,int x,int l,int r){
if(!p)return 0;
if(x==l&&x==r)return sum[p];
int mid=(l+r)>>1;
if(x<=mid)return query(lp[p],x,l,mid);
else return query(rp[p],x,mid+1,r);
}
inline int merge(int&x,int&y){
if(!x||!y)return x|y;
if(lp[x]==rp[x]){
sum[x]^=sum[y];
return x;
}
lp[x]=merge(lp[x],lp[y]);
rp[x]=merge(rp[x],rp[y]);
pushup(x);
return x;
}
bool ans[N];
int rt[N],res;
inline void solve(int x){
modify(rt[x],dep[x],1<<(s[x-1]-'a'),1,Maxdep);
for(auto y:e[x]){
solve(y);
rt[x]=merge(rt[x],rt[y]);
}
for(auto [d,id]:q[x]){
res=query(rt[x],d,1,Maxdep);
if(__builtin_popcount(res)<=1)ans[id]=1;
}
}
int main(){
read(n),read(m);
for(int i=2,x;i<=n;i++){
read(x);
e[x].pb(i);
}
dfs(dep[1]=1);
read(s);
for(int i=1,x,d;i<=m;i++){
read(x),read(d);
q[x].pb({d,i});
}
solve(1);
for(int i=1;i<=m;i++)write(ans[i]?"Yes\n":"No\n");
return 0;
}