Problem: Polycarpus got hold of a family tree. The found tree describes the family relations of n people, numbered from 1 to n. Every person in this tree has at most one direct ancestor. Also, each person in the tree has a name, the names are not necessarily unique.

We call the man with a number a a 1-ancestor of the man with a number b, if the man with a number a is a direct ancestor of the man with a number b.

We call the man with a number a a k-ancestor (k > 1) of the man with a number b, if the man with a number b has a 1-ancestor, and the man with a number a is a (k - 1)-ancestor of the 1-ancestor of the man with a number b.

In the tree the family ties do not form cycles. In other words there isn't a person who is his own direct or indirect ancestor (that is, who is an x-ancestor of himself, for some x, x > 0).

We call a man with a number a the k-son of the man with a number b, if the man with a number b is a k-ancestor of the man with a number a.

Polycarpus is very much interested in how many sons and which sons each person has. He took a piece of paper and wrote m pairs of numbers vi, ki. Help him to learn for each pair vi, ki the number of distinct names among all names of the ki-sons of the man with number vi.

Input

The first line of the input contains a single integer n (1 ≤ n ≤ 105) — the number of people in the tree. Next n lines contain the description of people in the tree. The i-th line contains space-separated string si and integer ri (0 ≤ ri ≤ n), where si is the name of the man with a number i, and ri is either the number of the direct ancestor of the man with a number i or 0, if the man with a number i has no direct ancestor. 

The next line contains a single integer m (1 ≤ m ≤ 105) — the number of Polycarpus's records. Next m lines contain space-separated pairs of integers. The i-th line contains integers vi, ki (1 ≤ vi, ki ≤ n).

It is guaranteed that the family relationships do not form cycles. The names of all people are non-empty strings, consisting of no more than 20 lowercase English letters.

Output

Print m whitespace-separated integers — the answers to Polycarpus's records. Print the answers to the records in the order, in which the records occur in the input.

Examples

Input

6
pasha 0
gerald 1
gerald 1
valera 2
igor 3
olesya 1
5
1 1
1 2
1 3
3 1
6 1


Output

2
2
0
1
0


Input

6
valera 0
valera 1
valera 1
gerald 0
valera 4
kolya 4
7
1 1
1 2
2 1
2 2
4 1
5 1
6 1


Output

1
0
0
0
2
0
0

Solution (in JAVA):

Solution:

import java.io.IOException;
import java.io.PrintWriter;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

public class B {

	public static void main(String[] args) throws IOException  {
		Scanner sc = new Scanner(System.in);
		PrintWriter wr = new PrintWriter(System.out);
		int n=sc.nextInt();
		int t[]=new int [n];
		N=n;
		adj=new ArrayList[N];
		depth=new ArrayList[N];
		for(int i=0;i<N;i++) {
			adj[i]=new ArrayList<>();
			depth[i]=new ArrayList<>();
		}
		tin=new int [N];
		tout=new int [N];
		L=new int[N];
		ArrayList<Integer>root=new ArrayList<>();
		for(int i=0;i<n;i++) {
			int v=sc.nextInt()-1;
			t[i]=v;
			if(v==-1)root.add(i);
			else adj[v].add(i);
		}
		int q=sc.nextInt();
		for(Integer x:root) {
			dfs(x,-1);
		}
		preprocessParents(t);
		while(q-->0) {
			int v=sc.nextInt()-1;
			int p=sc.nextInt();
			int H=L[v]-p;
			if(H<0) {
				wr.print(0+" ");
				continue;
			}
			int x=kth(v, H);
			if(x==-1 ) {
				wr.print(0+" ");
			}else {
				ArrayList<Integer>tmp=depth[L[v]];
				int z=-Collections.binarySearch(tmp,tin[x])-1;
				int y=-Collections.binarySearch(tmp,tout[x])-1;
				wr.print(Math.abs(z-y)-1+" ");

			}
		}


		wr.close();
	}

	static int []tin,tout;
	static int t;
	static ArrayList<Integer>adj[];
	static ArrayList<Integer>depth[];
	static int N, L[], P[][];
	static void dfs(int u,int par) {
		tin[u]=t++;
		if(par!=-1)
			L[u]=L[par]+1;
		depth[L[u]].add(tin[u]);
		for(int x:adj[u]) {
			if(x==par )continue;

			dfs(x,u);
		}
		tout[u]=t;
	}
	static void preprocessParents(int[] T)	
	{
		int k = 0; while(1<<k+1 < N) ++k;		
		P = new int[N][k + 1];
		for(int i = 0; i < N; i++)
			Arrays.fill(P[i], -1);
		for(int i = 0; i < N; ++i)
			P[i][0] = T[i];							
		for(int j = 1; j <= k; j++)			
			for(int i = 0; i < N; i++)
				if(P[i][j-1] != -1)
					P[i][j] = P[P[i][j-1]][j-1];
	}
	static int kth(int p,int H) {
		int k = 0;
		while(1<<k+1 <= L[p])
			++k;
		for (int i = k; i >= 0; --i) {
			if (L[p] - (1<<i) >= H )
				p = P[p][i];
		}
		return p;
	}

}
class Scanner 
{
	StringTokenizer st;
	BufferedReader br;

	public Scanner(InputStream s){	br = new BufferedReader(new InputStreamReader(s));}

	public String next() throws IOException 
	{
		while (st == null || !st.hasMoreTokens()) 
			st = new StringTokenizer(br.readLine());
		return st.nextToken();
	}

	public int nextInt() throws IOException {return Integer.parseInt(next());}
	
	public long nextLong() throws IOException {return Long.parseLong(next());}

	public String nextLine() throws IOException {return br.readLine();}
	
	public double nextDouble() throws IOException
	{
		String x = next();
		StringBuilder sb = new StringBuilder("0");
		double res = 0, f = 1;
		boolean dec = false, neg = false;
		int start = 0;
		if(x.charAt(0) == '-')
		{
			neg = true;
			start++;
		}
		for(int i = start; i < x.length(); i++)
			if(x.charAt(i) == '.')
			{
				res = Long.parseLong(sb.toString());
				sb = new StringBuilder("0");
				dec = true;
			}
			else
			{
				sb.append(x.charAt(i));
				if(dec)
					f *= 10;
			}
		res += Long.parseLong(sb.toString()) / f;
		return res * (neg?-1:1);
	}
	
	public boolean ready() throws IOException {return br.ready();}


}