RT,看起来没有丝毫的问题a,样例过不去
#include<bits/stdc++.h>
using namespace std;
//#define int long long
#define IO ios::sync_with_stdio(0),cin.tie(NULL)
const int N=5e5+10;
int n,q,siz[N],son[N],cnt[N][26],top,vis[N],sum[N],dep[N],Res[N];
vector<int> G[N];
char s[N];
void dfs(int u){
siz[u]=1;
for(int v:G[u]) {
dep[v]=dep[u]+1;
dfs(v);
siz[u]+=siz[v];
if(!son[u]||siz[v]>siz[son[u]])
son[u]=v;
}
}
void calc(int u,int val){
cnt[dep[u]][s[u]-'a']+=val;
//if(cnt[dep[u]][s[u]-'a']&1) ++Res[dep[u]];
//else --Res[dep[u]];
for(int v:G[u])
if(!vis[v]) calc(v,val);
}
struct Qry {
int dep,id;
};
bool ans[N];
vector<Qry> qq[N];
bool check(int num[]){
int ret=0;
for(int i=0;i<26;++i){
//printf("%d ",num[i]);
if(num[i]&1) ++ret;
if(ret>1) return 0;
}
//puts("");
if(ret>1) return 0;
return 1;
}
void dfs2(int u,int keep){
for(int v:G[u])
if(v!=son[u])
dfs2(v,0);
if(son[u]){
dfs2(son[u],1);
vis[son[u]]=1;
}
calc(u,1);
vis[son[u]]=0;
for(auto[d,id]:qq[u])
ans[id]=check(cnt[d]);//Res[d]<=1;
if(!keep)
calc(u,-1);
}
signed main(){
cin>>n>>q;
for(int i=1;i<n;++i){
int p;
cin>>p;
G[p].push_back(i+1);
}
cin>>s+1,dfs(1);
for(int i=1;i<=q;++i){
int x,de;
scanf("%d%d",&x,&de);
qq[x].push_back((Qry){de,i});
}
dfs2(1,0);
for(int i=1;i<=q;++i)
puts(ans[i]?"Yes":"No");
}