재귀적으로 정의된 프랙탈 트리 F_k에서 DFS 방문 순서로 번호가 매겨진 두 정점 사이의 거리를 구하는 질의에 답한다.
어려움9트리재귀분할 정복수학아직 제출이 없습니다시간 제한7초메모리 제한512 MB프랙털 트리 Fi를 다음과 같이 정의한다. 먼저 정점이 2개 이상인 루트 트리 F0이 주어진다. i≥1인 Fi는 재귀적으로 만든다. Fi−1에서 잎인 정점의 집합을 S라 하자. S에 속하는 각 정점 v를 F0의 복사본으로 바꾸고, 이때 v가 그 복사본의 루트가 된다.
정수 k가 주어질 때 트리 Fk에서 깊이 우선 탐색을 한다. 각 정점에서는 가장 왼쪽 자식의 서브트리를 모두 방문한 다음 두 번째 자식의 서브트리를 방문하고, 이런 식으로 왼쪽부터 차례로 모든 자식의 서브트리를 방문한다. 방문한 순서대로 정점에 1부터 시작하는 정수 번호를 붙인다. 아래 그림이 그 예이다.
![]() | ![]() | ![]() |
| (a) 트리 F0 | (b) 트리 F1 | (c) F1의 깊이 우선 탐색 번호 |
정점 두 개로 이루어진 질의가 주어진다. 각 질의마다 두 정점 사이의 거리를 구하라. 거리는 두 정점을 잇는 유일한 단순 경로의 간선 개수이다.
첫째 줄에 F0의 정점 개수 n이 주어진다 (2≤n≤100000). 정점 번호는 0부터 n−1까지이며 0번이 루트이다. 둘째 줄에 n−1개의 정수 p1,…,pn−1이 주어진다. 1≤i≤n−1에서 pi는 F0에서 정점 i의 부모이고 pi<i이다. 한 정점의 자식은 번호가 작을수록 왼쪽에 온다.
셋째 줄에 정수 k가 주어진다 (0≤k<230). 넷째 줄에 질의 개수 q가 주어진다 (1≤q≤100000). 다음 q개의 줄에는 질의가 한 줄에 하나씩 주어진다. 각 질의는 서로 다른 두 정수 a와 b로 이루어지고, 둘 다 Fk에 있는 정점의 번호이다. a와 b는 항상 유효한 번호, 즉 1 이상 Fk의 정점 개수 이하이며, 둘 다 230 이하이다.
각 질의 (a,b)마다 Fk에서 번호가 a인 정점과 번호가 b인 정점 사이의 거리를, 입력에 주어진 순서대로 한 줄에 하나씩 출력한다.