프랙털 트리
시간 제한7초메모리 제한512 MB
재귀적으로 정의된 프랙탈 트리 F_k에서 DFS 방문 순서로 번호가 매겨진 두 정점 사이의 거리를 구하는 질의에 답한다.
문제
프랙털 트리 를 다음과 같이 정의한다. 먼저 정점이 2개 이상인 루트 트리 이 주어진다. 인 는 재귀적으로 만든다. 에서 잎인 정점의 집합을 라 하자. 에 속하는 각 정점 를 의 복사본으로 바꾸고, 이때 가 그 복사본의 루트가 된다.
정수 가 주어질 때 트리 에서 깊이 우선 탐색을 한다. 각 정점에서는 가장 왼쪽 자식의 서브트리를 모두 방문한 다음 두 번째 자식의 서브트리를 방문하고, 이런 식으로 왼쪽부터 차례로 모든 자식의 서브트리를 방문한다. 방문한 순서대로 정점에 1부터 시작하는 정수 번호를 붙인다. 아래 그림이 그 예이다.
정점 두 개로 이루어진 질의가 주어진다. 각 질의마다 두 정점 사이의 거리를 구하라. 거리는 두 정점을 잇는 유일한 단순 경로의 간선 개수이다.
입력
첫째 줄에 의 정점 개수 이 주어진다 (). 정점 번호는 0부터 까지이며 0번이 루트이다. 둘째 줄에 개의 정수 이 주어진다. 에서 는 에서 정점 의 부모이고 이다. 한 정점의 자식은 번호가 작을수록 왼쪽에 온다.
셋째 줄에 정수 가 주어진다 (). 넷째 줄에 질의 개수 가 주어진다 (). 다음 개의 줄에는 질의가 한 줄에 하나씩 주어진다. 각 질의는 서로 다른 두 정수 와 로 이루어지고, 둘 다 에 있는 정점의 번호이다. 와 는 항상 유효한 번호, 즉 1 이상 의 정점 개수 이하이며, 둘 다 이하이다.
출력
각 질의 마다 에서 번호가 인 정점과 번호가 인 정점 사이의 거리를, 입력에 주어진 순서대로 한 줄에 하나씩 출력한다.


