아직 만들고 있는 페이지입니다.

이 페이지는 아직 만드는 중입니다. 보이는 내용은 바뀔 수 있습니다.

프랙털 트리

시간 제한7초메모리 제한512 MB

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

어려움10점 중 9점

유형
트리, 재귀, 분할 정복, 수학
정답자
아직 제출이 없습니다

문제

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

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

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

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

입력

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

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

출력

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

예제1

  1. 예제 1

    입력
    4
    0 1 0
    1
    10
    1 2
    1 4
    1 6
    1 8
    1 10
    5 10
    6 8
    9 3
    7 10
    8 9
    
    예상 출력
    1
    3
    3
    2
    2
    6
    5
    5
    1
    1