Please subscribe to the official Codeforces channel in Telegram via the link https://t.me/codeforces_official. ×

 
 
 
 
General
 
 
# Author Problem Lang Verdict Time Memory Sent Judged  
152539033 Practice:
Alex_Wei
570D - 28 C++17 (GCC 9-64) Accepted 1387 ms 227464 KB 2022-04-03 07:22:17 2022-04-03 07:22:17
→ Source
#include <bits/stdc++.h>
using namespace std;
const int N = 5e5 + 5, K = N * 20;
char s[N];
vector <int> e[N];
vector <pair <int, int>> q[N];
int n, m, ans[N], dep[N], fa[N];
int node, R[N], ls[K], rs[K], val[K];
void modify(int l, int r, int p, int &x, int v) {
	val[x = ++node] = v;
	if(l == r) return;
	int m = l + r >> 1;
	if(p <= m) modify(l, m, p, ls[x], v);
	else modify(m + 1, r, p, rs[x], v);
}
int query(int p, int x) {
	int l = 1, r = n;
	while(l < r) {
		int m = l + r >> 1;
		if(p <= m) x = ls[x], r = m;
		else x = rs[x], l = m + 1;
	}
	return val[x];
}
int merge(int x, int y) {
	if(!x || !y) return x | y;
	ls[x] = merge(ls[x], ls[y]), rs[x] = merge(rs[x], rs[y]);
	return val[x] ^= val[y], x;
}
void dfs(int id) {
	modify(1, n, dep[id] = dep[fa[id]] + 1, R[id], 1 << s[id] - 'a');
	for(int it : e[id]) dfs(it), R[id] = merge(R[id], R[it]);
	for(auto it : q[id]) ans[it.second] = __builtin_popcount(query(it.first, R[id])) < 2;
}
int main() {
	cin >> n >> m;
	for(int i = 2; i <= n; i++) scanf("%d", &fa[i]), e[fa[i]].push_back(i);
	cin >> s + 1;
	for(int i = 1, v, h; i <= m; i++) scanf("%d %d", &v, &h), q[v].push_back({h, i});
	dfs(1);
	for(int i = 1; i <= m; i++) puts(ans[i] ? "Yes" : "No");
	return 0;
}
?
Time: ? ms, memory: ? KB
Verdict: ?
Input
?
Participant's output
?
Jury's answer
?
Checker comment
?
Diagnostics
?
Click to see test details