#include <bits/stdc++.h>
#define int long long
using namespace std;
inline int read(){
int x=0,f=1;
char ch=getchar();
while(!isdigit(ch)){if(ch=='-')f=-1;ch=getchar();}
while(isdigit(ch)){x=(x<<1)+(x<<3)+(ch^48);ch=getchar();}
return x*f;
}
int n,m;
int head[114514],tot,kami;
int root[114514],cnt;
int r[114514],f[114514][50];
int dep[114514],v[114514],vis[114514];
int ans[114514],ass[114514];
struct nd{
int nex,to;
}edge[114514<<1];
struct nn{
int ls,rs,val;
}tr[4145141];
void add(int x,int y)
{
edge[++tot].nex = head[x];
edge[tot].to = y;
head[x] = tot;
}
void pushup(int rt){
tr[rt].val = tr[tr[rt].ls].val+tr[tr[rt].rs].val;
}
int merge(int x,int y,int l,int r)
{
if (!x) return y;
if (!y) return x;
if (l == r){
tr[x].val += tr[y].val;
return x;
}
int mid = (l+r) >> 1;
tr[x].ls = merge(tr[x].ls,tr[y].ls,l,mid);
tr[x].rs = merge(tr[x].rs,tr[y].rs,mid+1,r);
pushup(x);
return x;
}
int add(int rt,int l,int r,int x,int a)
{
if (!rt) rt = ++cnt;
if (l == r){
tr[rt].val += a;
return rt;
}
int mid = (l+r) >> 1;
if (x <= mid) tr[rt].ls = add(tr[rt].ls,l,mid,x,a);
else tr[rt].rs = add(tr[rt].rs,mid+1,r,x,a);
pushup(rt);
return rt;
}
int query(int rt,int l,int r,int x)
{
int res = 0;
if (l == r) return tr[rt].val;
int mid = (l+r) >> 1;
if (x <= mid) res += query(tr[rt].ls,l,mid,x);
else res += query(tr[rt].rs,mid+1,r,x);
return res;
}
void df(int x,int fa)
{
dep[x] = dep[fa]+1;
for (int i = 1; i <= 20; i++)
f[x][i] = f[f[x][i-1]][i-1];
root[x] = add(root[x],1,2e5,dep[x],1);
for (int i = head[x]; i; i = edge[i].nex)
{
int v = edge[i].to;
if (v == fa) continue;
df(v,x);
}
}
int find(int x,int k)
{
int cao = 0;
for (int i = 20; i >= 0; i--)
if (cao+(1<<i) <= k) cao += (1<<i),x = f[x][i];
return x;
}
void dfs(int x)
{
for (int i = head[x]; i; i = edge[i].nex)
{
int v = edge[i].to;
if (v == f[x][0]) continue;
dfs(v);
root[x] = merge(root[x],root[v],1,2e5);
}
if (vis[x]) ans[x] = query(root[x],1,2e5,dep[x]+ass[x])-1;
}
signed main()
{
n = read();
for (int i = 1,x; i <= n; i++){
x = read();
if (x == 0) r[++kami] = i;
else add(i,x),add(x,i),f[i][0] = x;
}
for (int i = 1; i <= kami; i++)
df(r[i],0);
m = read();
int k;
for (int i = 1; i <= m; i++)
{
v[i] = read(); k = read();
v[i] = find(v[i],k);
vis[v[i]] = 1; ass[v[i]] = k;
}
for (int i = 1; i <= kami; i++)
dfs(r[i]);
for (int i = 1; i <= m; i++)
printf("%lld ",ans[v[i]]);
return 0;
}