#include<bits/stdc++.h>
using namespace std;
const int N = 1e6 + 5;
struct tree{
int ls, rs, sum;
}t[N * 55];
struct data{
int x, d, ans, id;
}ANS[N];
vector<data>a[N];
int n, Q, son[N << 1], nxt[N << 1], fir[N], tot, x, dep[N], rt[N], cnt, k, fa[N][21], kk, dd;
inline void add(int x, int y){
nxt[++tot] = fir[x];
fir[x] = tot;
son[tot] = y;
}
inline void update(int &p, int l, int r, int x, int val){
if(p == 0) p = ++cnt;
if(l == r){
t[p].sum += val;
return ;
}
int mid = l + r >> 1;
if(mid >= x) update(t[p].ls, l, mid, x, val);
else update(t[p].rs, mid + 1, r, x, val);
t[p].sum = t[t[p].ls].sum + t[t[p].rs].sum;
}
inline void merge(int &p, int q){
if(!p || !q){
p = p + q;
return ;
}
t[p].sum += t[q].sum;
if(t[t[p].ls].sum + t[t[q].rs].sum) merge(t[p].ls, t[q].ls);
if(t[t[p].rs].sum + t[t[q].rs].sum) merge(t[p].rs, t[q].rs);
}
inline void dfs(int x, int ff){
dep[x] = dep[ff] + 1;
fa[x][0] = ff;
for(int i = 1; i <= 20; i++) fa[x][i] = fa[fa[x][i - 1]][i - 1];
update(rt[x], 1, n, dep[x], 1);
for(int i = fir[x]; i ; i = nxt[i]){
dfs(son[i], x);
}
}
inline int query(int p, int l, int r, int x){
if(l == r) return t[p].sum;
int mid = l + r >> 1;
if(mid >= x) return query(t[p].ls, l, mid, x);
else return query(t[p].rs, mid + 1, r, x);
}
inline void dfs2(int x, int ff){
for(int i = fir[x]; i ; i = nxt[i]){
dfs2(son[i], x);
merge(rt[x], rt[son[i]]);
}
for(auto i : a[x]){
i.ans = query(rt[x], 1, n, i.d) - 1;
ANS[++cnt] = i;
}
}
inline bool cmp(data x, data y){
return x.id < y.id;
}
int main(){
scanf("%d%d", &n, &Q);
for(int i = 2; i <= n; i++){
scanf("%d", &x);
add(x, i);
}
dfs(1, 0);
for(int i = 1; i <= Q; i++){
scanf("%d%d", &x, &k);
dd = dep[x];
kk = k;
for(int i = 20; ~i; i--){
if(kk >= (1 << i)){
kk -= (1 << i);
x = fa[x][i];
}
}
a[x].push_back((data){x, dd, 0, i});
}
cnt = 0;
dfs2(1, 0);
sort(ANS + 1, ANS + cnt + 1, cmp);
for(int i = 1; i <= Q; i++) printf("%d ", ANS[i].ans);
return 0;
}
感谢各位大佬。