만드는 중입니다

아직 만드는 중이라 바뀔 수 있습니다

트리 퀴즈

시간 제한4초메모리 제한1024 MB

요약
루트가 있는 트리가 주어질 때, 모든 (x, y) 쌍의 LCA(x, y)로 만든 키 값을 정렬한 배열에서 질의마다 k번째 원소를 구합니다.
난이도

어려움10점 중 8점

유형
트리, DFS, 이분 탐색
정답자
아직 제출이 없습니다

문제

친구가 퀴즈를 내려고 한다. nn개의 노드로 이루어진 루트 트리가 주어지며, 노드는 11부터 nn까지 번호가 매겨져 있다. 노드 ii의 부모는 노드 pip_i이고, 부모가 없는 루트는 pi=0p_i = 0이다. 노드 uu가 노드 vv의 조상이라는 것은 u=vu = v이거나, uu가 vv의 부모의 조상인 경우(부모가 존재하는 경우에 한함)를 뜻한다.

노드 zz가 노드 xx와 yy의 공통 조상이라는 것은 zz가 xx와 yy 모두의 조상이라는 뜻이다. 노드 zz가 xx와 yy의 최소 공통 조상이라는 것은, zz가 xx와 yy의 공통 조상이면서 xx와 yy의 모든 공통 조상이 zz의 조상이기도 하다는 뜻이다. xx와 yy의 최소 공통 조상을 LCA(x,y)LCA(x, y)로 나타낸다. 특히 LCA(x,x)=xLCA(x, x) = x이다.

친구는 아래 의사 코드를 실행하려고 한다.

let L be an empty array
for x = 1 to n
  for y = 1 to n
    append ((x - 1) * n * n + (LCA(x, y) - 1) * n + (y - 1)) to L
sort L in non-decreasing order

친구가 qq개의 질문을 던진다. jj번째 질문에서는 정수 kjk_j가 주어지며, 배열 LL의 kjk_j번째 원소를 구해야 한다. LL의 인덱스는 1부터 시작하므로 범위는 1 이상 n2n^2 이하이다. 퀴즈를 통과하려면 모든 질문에 답해야 한다.

입력

첫 줄에 두 정수 nn과 qq가 주어진다(1≤n≤100 0001 \le n \le 100\,000, 1≤q≤100 0001 \le q \le 100\,000). 둘째 줄에는 정수 p1,p2,…,pnp_1, p_2, \dots, p_n이 주어진다(0≤pi≤n0 \le p_i \le n). 주어진 값은 루트 트리를 나타냄이 보장된다. 이어서 qq개의 줄에 정수가 하나씩 주어진다. jj번째 줄에는 kjk_j가 주어진다(1≤kj≤n21 \le k_j \le n^2).

출력

질문 순서대로 각 질문의 답인 정수를 출력한다.

예제1

  1. 예제 1

    입력
    5 3
    3 0 2 2 3
    1
    18
    25
    
    예상 출력
    0
    82
    124