트리

루트가 있는 트리에서 정점을 삭제하면 자식들이 조부모에게 붙고, 살아 있는 두 정점 사이의 거리를 묻는 쿼리에 답한다.

어려움8트리DFS세그먼트 트리동적 계획법아직 제출이 없습니다시간 제한2초메모리 제한512 MB

문제

정점이 nn개인 루트 있는 트리가 있다. 정점 번호는 1번부터 nn번까지이고, 1번 정점이 루트다. 루트 있는 트리는 연결된 무향 그래프에서 정점 하나를 루트로 정한 것이다. 각 정점에서 루트에 가장 가까운 이웃이 그 정점의 부모이고, 나머지 이웃은 자식이다. 루트에는 부모가 없다.

이 트리에 두 종류의 질의를 순서대로 처리한다.

첫 번째는 삭제다. 정점 uu를 삭제하면 uu의 자식은 모두 uu의 부모의 자식이 된다. 루트는 삭제하지 않는다.

두 번째는 거리 계산이다. 현재 트리에서 두 정점을 잇는 경로의 길이를 구한다. 경로의 길이는 그 경로에 놓인 간선의 개수다.

거리를 묻는 질의마다 답을 출력하라.

입력

첫째 줄에 처음 트리의 정점 개수 nn이 주어진다. (1n1000001 \le n \le 100000)

둘째 줄에 정점 2,3,,n2, 3, \ldots, n의 부모 번호 pip_i가 순서대로 주어진다. (1pin1 \le p_i \le n) nn이 1이면 둘째 줄은 빈 줄이다.

셋째 줄에 질의의 개수 qq가 주어진다. (1q1000001 \le q \le 100000)

다음 qq개 줄에 질의가 한 줄에 하나씩 주어진다. 각 질의는 1 또는 2인 정수로 시작한다. 첫 정수가 1이면 정수 aabb가 이어서 주어지고, 현재 트리에서 aabb 사이의 거리를 구해야 한다. (1a,bn1 \le a, b \le n) 첫 정수가 2이면 정수 vv 하나가 이어서 주어지고, 정점 vv를 삭제해야 한다. (1vn1 \le v \le n)

처음 주어지는 트리는 항상 올바르다. 질의에 등장하는 정점은 아직 삭제되지 않은 정점이고, 루트는 삭제할 정점으로 주어지지 않는다.

출력

첫 정수가 1인 질의마다 두 정점 사이의 거리를 한 줄에 하나씩 출력한다.