#include <bits/stdc++.h>
#define maxn 1000005
using namespace std;
int dep[maxn], fa[maxn], n, pq[maxn], k, cnt, tot, f[maxn][25], head[maxn], rt[maxn], m;
struct node {
int v, pre;
}e[maxn << 1];
struct nod {
int ls, rs, sum;
}tr[maxn << 2];
int Q[maxn], P[maxn], V[maxn];
void add(int u, int v) {
e[++tot].v = v;
e[tot].pre = head[u];
head[u] = tot;
}
void dfs1(int now, int fat) {
f[now][0] = fat;
dep[now] = dep[fat] + 1;
for(int i = 1;i <= 20;i++) f[now][i] = f[f[now][i - 1]][i - 1];
for(int i = head[now];i;i = e[i].pre) {
int v = e[i].v;
if(v != fat) dfs1(v, now);
}
}
void pushup(int p) {
tr[p].sum = tr[tr[p].ls].sum + tr[tr[p].rs].sum;
}
int update(int l, int r, int k, int p) {
if(!p) p = ++cnt;
if(l == r) {
tr[p].sum ++;
return p;
}
int mid = (l + r) >>1;
if(k <= mid) tr[p].ls = update(l, mid, k, tr[p].ls);
if(k > mid) tr[p].rs = update(mid + 1, r, k, tr[p].rs);
pushup(p);
return p;
}
int merge(int l, int r, int x, int y) {
if(!x || !y) return x + y;
if(l == r) {
tr[x].sum = tr[x].sum + tr[y].sum;
return x;
}
int mid = (l + r) >> 1;
tr[x].ls = merge(l, mid, tr[x].ls, tr[y].ls);
tr[x].rs = merge(mid + 1, r, tr[x].rs, tr[y].rs);
pushup(x);
return x;
}
void dfs2(int now) {
rt[now] = update(1, n, dep[now], rt[now]);
for(int i = head[now];i;i = e[i].pre) {
int v = e[i].v;
if(v != f[now][0]) {
dfs2(v);
rt[now] = merge(1, n, rt[now], rt[v]);
}
}
}
int query(int l, int r, int k, int p) {
if(!p) return 0;
if(l == r) return tr[p].sum;
int mid = (l + r) >> 1;
if(k <= mid) return query(l, mid, k, tr[p].ls);
else return query(mid + 1, r, k, tr[p].rs);
}
int main() {
scanf("%d", &n);
for(int i = 1;i <= n;i++) {
int x;
scanf("%d", &x);
if(x) add(i, x), add(x, i);
else pq[++k] = i;
}
scanf("%d", &m);
for(int i = 1;i <= k;i++) dfs1(pq[i], 0);
for(int i = 1;i <= m;i++) scanf("%d%d", &V[i], &P[i]);
for(int i = 1;i <= m;i++) {
int x = P[i], now = V[i], count = 0;
while(x != 0) {
if(x & 1) now = f[now][count];
count ++;
x >>= 1;
}
Q[i] = now;
}
for(int i = 1;i <= k;i++) dfs2(pq[i]);
for(int i = 1;i <= m;i++) {
int q = Q[i], p = P[i];
int k = query(1, n, dep[q] + p, rt[q]);
printf("%d ", k - (k != 0));
}
}
第8个点WA