프랙털 트리

재귀적으로 정의된 프랙탈 트리 F_k에서 DFS 방문 순서로 번호가 매겨진 두 정점 사이의 거리를 구하는 질의에 답한다.

어려움9트리재귀분할 정복수학아직 제출이 없습니다시간 제한7초메모리 제한512 MB

문제

프랙털 트리 FiF_i를 다음과 같이 정의한다. 먼저 정점이 2개 이상인 루트 트리 F0F_0이 주어진다. i1i \ge 1FiF_i는 재귀적으로 만든다. Fi1F_{i-1}에서 잎인 정점의 집합을 SS라 하자. SS에 속하는 각 정점 vvF0F_0의 복사본으로 바꾸고, 이때 vv가 그 복사본의 루트가 된다.

정수 kk가 주어질 때 트리 FkF_k에서 깊이 우선 탐색을 한다. 각 정점에서는 가장 왼쪽 자식의 서브트리를 모두 방문한 다음 두 번째 자식의 서브트리를 방문하고, 이런 식으로 왼쪽부터 차례로 모든 자식의 서브트리를 방문한다. 방문한 순서대로 정점에 1부터 시작하는 정수 번호를 붙인다. 아래 그림이 그 예이다.

(a) 트리 F0F_0(b) 트리 F1F_1(c) F1F_1의 깊이 우선 탐색 번호

정점 두 개로 이루어진 질의가 주어진다. 각 질의마다 두 정점 사이의 거리를 구하라. 거리는 두 정점을 잇는 유일한 단순 경로의 간선 개수이다.

입력

첫째 줄에 F0F_0의 정점 개수 nn이 주어진다 (2n1000002 \le n \le 100\,000). 정점 번호는 0부터 n1n-1까지이며 0번이 루트이다. 둘째 줄에 n1n-1개의 정수 p1,,pn1p_1, \dots, p_{n-1}이 주어진다. 1in11 \le i \le n-1에서 pip_iF0F_0에서 정점 ii의 부모이고 pi<ip_i < i이다. 한 정점의 자식은 번호가 작을수록 왼쪽에 온다.

셋째 줄에 정수 kk가 주어진다 (0k<2300 \le k < 2^{30}). 넷째 줄에 질의 개수 qq가 주어진다 (1q1000001 \le q \le 100\,000). 다음 qq개의 줄에는 질의가 한 줄에 하나씩 주어진다. 각 질의는 서로 다른 두 정수 aabb로 이루어지고, 둘 다 FkF_k에 있는 정점의 번호이다. aabb는 항상 유효한 번호, 즉 1 이상 FkF_k의 정점 개수 이하이며, 둘 다 2302^{30} 이하이다.

출력

각 질의 (a,b)(a, b)마다 FkF_k에서 번호가 aa인 정점과 번호가 bb인 정점 사이의 거리를, 입력에 주어진 순서대로 한 줄에 하나씩 출력한다.