https://codeforces.com/gym/241159/problem/D
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
string ch;
vector<int> vec[500100];
vector<int> ans[500100];
vector<pair<ll,ll> > num[500100];
struct node{
int l;
int r;
int depth;
}tree[500100];
int sign;
void dfs(int id,int depth){
tree[id].l=sign;
tree[id].depth=depth;
ans[depth].push_back(id);
for(int i=0;i<vec[id].size();i++){
sign+=1;
dfs(vec[id][i],depth+1);
}
tree[id].r=sign+1;
}
int getnum(ll fir,ll sec){
int co=0;
for(int i=0;i<13;i++){
if(fir&(1<<i))
co++;
if(sec&(1<<i))
co++;
}
return co;
}
int main(){
int n,m,temp;
cin>>n>>m;
for(int i=2;i<=n;i++){
scanf("%d",&temp);
vec[temp].push_back(i);
}
cin>>ch;
sign=0;
dfs(1,1);
for(int i=1;i<=n;i++){
for(int j=0;j<ans[i].size();j++){
ll fir=0,sec=0;
if(ch[ans[i][j]-1]>'m')
fir+=(1<<(ch[ans[i][j]-1]-'n'));
else
sec+=(1<<(ch[ans[i][j]-1]-'a'));
if(j!=0){
fir^=num[i][j-1].first;
sec^=num[i][j-1].second;
}
num[i].push_back(make_pair<long,long>(fir,sec));
}
}
int v,h;
while(m--){
scanf("%d%d",&v,&h);
int l=0;
int r=ans[h].size()-1;
int templ=r+1,tempr=-1;
while(l<=r){
int mid=(l+r)/2;
if(tree[ans[h][mid]].l<=tree[v].l){
l=mid+1;
}
else{
r=mid-1;
templ=mid;
}
}
l=0;
r=ans[h].size()-1;
while(l<=r){
int mid=(l+r)/2;
if(tree[ans[h][mid]].l>=tree[v].r){
r=mid-1;
}
else{
l=mid+1;
tempr=mid;
}
}
ll fir=0,sec=0;
if(templ>0&&tempr<ans[h].size()&&templ<=tempr){
fir=num[h][tempr].first^num[h][templ-1].first;
sec=num[h][tempr].second^num[h][templ-1].second;
}
else if(templ<=tempr&&templ==0){
fir=num[h][tempr].first;
sec=num[h][tempr].second;
}
int co=getnum(fir,sec);
if(co<=1)
printf("Yes\n");
else
printf("No\n");
}
}