트리 뽑아내기

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

요약
항상 가장 작은 가중치를 가진 자식으로 내려가는 특별한 경로를 따라 가중치를 한 칸씩 밀고 리프를 제거하는 연산을 N번 반복하며, 매 연산 전 루트에 적힌 가중치를 출력한다.
난이도

쉬움10점 중 3점

유형
트리, 시뮬레이션
정답자
아직 제출이 없습니다

문제

11번 정점부터 NN번 정점까지 NN개의 정점으로 이루어진 루트 있는 트리가 있다. 이 트리의 루트 정점은 11번 정점이고, ii번 정점의 부모 정점은 P_iP\_i번 정점이다(2≤i≤N2 \le i \le N). 또한 각 정점은 서로 다른 정수 가중치를 갖고 있다. 이때 ii번 정점의 가중치는 A_iA\_i이다(1≤i≤N1 \le i \le N). 자식을 가지지 않은 정점을 리프 정점이라고 한다.

루트 정점인 11번 정점에서 출발하여 자식 중에 가중치가 가장 작은 정점으로 이동하는 것을 반복하자. 리프 정점에 도달할 때까지 이를 반복하면 11번 정점에서 시작하여 리프 정점에서 끝나는 경로 SS를 얻을 수 있다. 이때 S=S_1,⋯ ,S_kS = {S\_1, \cdots, S\_k}를 특별한 경로라고 정의한다.

또한, 뽑아내기 연산을 다음과 같이 정의한다.

  • 뽑아내기:

    • 현재 트리의 특별한 경로가 S=S_1,⋯ ,S_kS = {S\_1, \cdots, S\_k}이라고 하자.
    • S_1S\_1번 정점과 S_2S\_2번 정점의 가중치를 교환한다.
    • S_2S\_2번 정점과 S_3S\_3번 정점의 가중치를 교환한다.
    • ⋯\cdots
    • S_k−1S\_{k-1}번 정점과 S_kS\_k번 정점의 가중치를 교환한다.
    • S_kS\_k번 정점과 그 부모를 잇는 간선을 트리에서 제거한다.

즉, 뽑아내기 연산은 특별한 경로 위에 있는 정점들의 가중치를 경로 상에서 자신 다음에 등장하는 정점의 가중치로 수정하고, 특별한 경로의 마지막에 위치한 리프 정점을 제거하는 연산이다.

예를 들어, 아래와 같은 트리들을 생각하자. 원 밖의 수는 정점의 번호를 나타내고, 원 안의 수는 그 정점의 가중치를 나타낸다.

첫 번째 트리의 특별한 경로를 찾아보자. 루트 정점인 11번 정점에서 출발하여 11번 정점의 자식 중 가중치가 가장 작은 33번 정점으로 이동하고, 33번 정점의 자식 중 가중치가 가장 작은 44번 정점으로 이동한다. 44번 정점은 리프 정점이기 때문에 특별한 경로가 S=1,3,4S = {1, 3, 4}임을 알 수 있다. 이제 이 트리에 뽑아내기 연산을 적용하면 11번 정점과 33번 정점의 가중치를 교환하고, 33번 정점과 44번 정점의 가중치를 교환한 뒤 44번 정점을 트리에서 제거하여 두 번째 트리와 같은 모양이 된다.

두 번째 트리의 특별한 경로를 찾아보자. 루트 정점인 11번 정점에서 시작하여 11번 정점의 자식 중 가중치가 가장 작은 22번 정점으로 이동한다. 22번 정점이 리프 정점이기 때문에 특별한 경로가 S=1,2S = {1, 2}임을 알 수 있다. 이제 이 트리에 뽑아내기 연산을 적용하면 11번 정점과 22번 정점의 가중치를 교환한 뒤 22번 정점을 트리에서 제거하여 세 번째 트리와 같은 모양이 된다.

세 번째 트리의 특별한 경로를 찾아보자. 루트 정점인 11번 정점에서 시작하여 11번 정점의 유일한 자식인 33번 정점으로 이동하고, 33번 정점의 유일한 자식인 55번 정점으로 이동한다. 55번 정점이 리프 정점이기 때문에 특별한 경로가 S=1,3,5S = {1, 3, 5}임을 알 수 있다. 이제 이 트리에 뽑아내기 연산을 적용하면 11번 정점과 33번 정점의 가중치를 교환하고, 33번 정점과 55번 정점의 가중치를 교환한 뒤 55번 정점을 트리에서 제거하여 네 번째 트리와 같은 모양이 된다.

마찬가지로 네 번째 트리의 특별한 경로는 S=1,3S = {1, 3}이다. 이 트리에 뽑아내기 연산을 적용하면 11번 정점과 33번 정점의 가중치를 교환한 뒤 33번 정점을 트리에서 제거하여 다섯 번째 트리와 같은 모양이 된다.

마지막으로 다섯 번째 트리의 특별한 경로는 S=1S = {1}이며, 뽑아내기 연산을 적용하면 11번 정점이 트리에서 제거된다.

이와 같이 우리는 주어진 트리에 뽑아내기 연산을 NN번 수행하려고 한다. 이때, 각 뽑아내기 연산을 수행하기 전에 11번 정점에 적혀 있던 가중치의 값을 모두 구하는 프로그램을 작성하라.

입력

첫 번째 줄에 정수 NN이 주어진다.

두 번째 줄에 N−1N-1개의 정수 P_2,⋯ ,P_NP\_2, \cdots, P\_N이 공백을 사이에 두고 주어진다.

세 번째 줄에 NN개의 정수 A_1,⋯ ,A_NA\_1, \cdots, A\_N이 공백을 사이에 두고 주어진다.

출력

첫 번째 줄부터 NN개의 줄에 걸쳐 답을 출력한다. 이 중 i(1≤i≤N)i(1 \le i \le N)번째 줄에는 ii번째 뽑아내기 연산을 수행하기 전 11번 정점에 적혀 있던 가중치의 값을 출력한다.

제한

  • 주어지는 모든 수는 정수이다.
  • 2≤N≤300,0002 \le N \le 300\\,000
  • 1≤P_i<i1 \le P\_i < i (2≤i≤N)(2 \le i \le N)
  • 1≤A_i≤N1 \le A\_i \le N (1≤i≤N)(1 \le i \le N)
  • A_1,⋯ ,A_NA\_1, \cdots, A\_N은 서로 다르다.

예제1

  1. 예제 1

    입력
    5
    1 1 3 3
    5 2 1 3 4
    
    예상 출력
    5
    1
    2
    3
    4