Tree Requests

Roman planted a tree consisting of n vertices. Each vertex contains a lowercase English letter. Vertex 1 is the root of the tree, each of the n1n - 1 remaining vertices has a parent in the tree. Vertex is connected with its parent by an edge. The parent of vertex ii is vertex pip _i, the parent index is always less than the index of the vertex (i.e., pi<ip _i < i).

The depth of the vertex is the number of nodes on the path from the root to v along the edges. In particular, the depth of the root is equal to 1.

We say that vertex u is in the subtree of vertex v, if we can get from u to v, moving from the vertex to the parent. In particular, vertex v is in its subtree.

Roma gives you m queries, the i-th of which consists of two numbers viv _i, hih _i. Let’s consider the vertices in the subtree v i located at depth h i. Determine whether you can use the letters written at these vertices to make a string that is a palindrome. The letters that are written in the vertexes, can be rearranged in any order to make a palindrome, but all letters should be used.

Input
The first line contains two integers n,m(1n,m500000)n, m (1 ≤ n, m ≤ 500 000) — the number of nodes in the tree and queries, respectively.

The following line contains n1n - 1 integers p2,p3,...,pnp _2, p_ 3, ..., p _n — the parents of vertices from the second to the n-th (1pi<i)(1 ≤ p _i < i).

The next line contains n lowercase English letters, the i-th of these letters is written on vertex i.

Next m lines describe the queries, the i-th line contains two numbers vi,hi(1vi,hin)v_ i, h _i (1 ≤ v _i, h_ i ≤ n) — the vertex and the depth that appear in the i-th query.

Output
Print m lines. In the i-th line print “Yes” (without the quotes), if in the i-th query you can make a palindrome from the letters written on the vertices, otherwise print “No” (without the quotes).

Examples

input
6 5
1 1 1 3 3
zacccd
1 1
3 3
4 1
6 1
1 2
output
Yes
No
Yes
Yes
Yes

Note
String s is a palindrome if reads the same from left to right and from right to left. In particular, an empty string is a palindrome.

Clarification for the sample test.

In the first query there exists only a vertex 1 satisfying all the conditions, we can form a palindrome “z”.

In the second query vertices 5 and 6 satisfy condititions, they contain letters “с” and “d” respectively. It is impossible to form a palindrome of them.

In the third query there exist no vertices at depth 1 and in subtree of 4. We may form an empty palindrome.

In the fourth query there exist no vertices in subtree of 6 at depth 1. We may form an empty palindrome.

In the fifth query there vertices 2, 3 and 4 satisfying all conditions above, they contain letters “a”, “c” and “c”. We may form a palindrome “cac”.
樹上啓發式合併,check[d]check[d]數組保存深度爲dd的節點的異或值。

#include<bits/stdc++.h>

#define si(a) scanf("%d",&a)
#define sl(a) scanf("%lld",&a)
#define sd(a) scanf("%lf",&a)
#define sc(a) scahf("%c",&a);
#define ss(a) scanf("%s",a)
#define pi(a) printf("%d\n",a)
#define pl(a) printf("%lld\n",a)
#define pc(a) putchar(a)
#define ms(a) memset(a,0,sizeof(a))
#define repi(i, a, b) for(register int i=a;i<=b;++i)
#define repd(i, a, b) for(register int i=a;i>=b;--i)
#define reps(s) for(register int i=head[s];i;i=Next[i])
#define ll long long
#define vi vector<int>
#define pii pair<int,int>
#define mii unordered_map<int,int>
#define msi unordered_map<string,int>
#define lowbit(x) ((x)&(-(x)))
#define ce(i, r) i==r?'\n':' '
#define pb push_back
#define fi first
#define se second
#define INF 0x3f3f3f3f
#define pr(x) cout<<#x<<": "<<x<<endl
using namespace std;

inline int qr() {
    int f = 0, fu = 1;
    char c = getchar();
    while (c < '0' || c > '9') {
        if (c == '-')fu = -1;
        c = getchar();
    }
    while (c >= '0' && c <= '9') {
        f = (f << 3) + (f << 1) + c - 48;
        c = getchar();
    }
    return f * fu;
}

const int N = 5e5 + 10;
int head[N], ver[N << 1], Next[N << 1], tot;
int n, m, son[N], d[N], check[N], dfn[N], s[N], num, id[N];
bool ans[N];
char str[N];
vector<pii > q[N];

inline void add(int x, int y) {
    ver[++tot] = y;
    Next[tot] = head[x];
    head[x] = tot;
}

inline void read() {
    n = qr(), m = qr();
    repi(y, 2, n) {
        int x = qr();
        add(x, y), add(y, x);
    }
    ss(str + 1);
    repi(i, 1, m) {
        int x = qr(), d = qr();
        q[x].pb({d, i});
    }
}

void dfs(int x) {
    dfn[x] = ++num, id[num] = x, s[x] = 1;
    reps(x) {
        int y = ver[i];
        if (d[y])continue;
        d[y] = d[x] + 1, dfs(y), s[x] += s[y];
        son[x] = s[y] > s[son[x]] ? y : son[x];
    }
}

void dfs(int x, int f, bool k) {
    reps(x) {
        int y = ver[i];
        if (y == f || y == son[x])continue;
        dfs(y, x, false);
    }
    if (son[x])dfs(son[x], x, true);
    check[d[x]] ^= 1 << (str[x] - 'a');
    reps(x) {
        int y = ver[i];
        if (y == f || y == son[x])continue;
        repi(j, dfn[y], dfn[y] + s[y] - 1)check[d[id[j]]] ^= 1 << (str[id[j]] - 'a');
    }
    for (auto it:q[x])ans[it.se] = check[it.fi] == lowbit(check[it.fi]);
    if (!k)repi(i, dfn[x], dfn[x] + s[x] - 1)check[d[id[i]]] ^= 1 << (str[id[i]] - 'a');
}

int main() {
    read();
    d[1] = 1;
    dfs(1);
    dfs(1, 0, true);
    repi(i, 1, m)puts(ans[i] ? "Yes" : "No");
    return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章