카운터스펠

루트가 있는 트리에 검은 잎을 하나씩 붙일 때마다, 유일한 올바른 색칠을 회복하기 위해 색을 뒤집어야 하는 최소 정점 수를 구한다.

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

문제

카드 게임 Magic: The Gathering에는 주문을 시전하고 상쇄하는 규칙이 있다. 아래 색칠 규칙은 여기에서 따왔다. 카드 게임 자체는 설명하지 않으며, 문제를 푸는 데 알 필요도 없다.

뿌리 있는 트리마다 다음 조건을 만족하도록 정점을 검은색과 흰색으로 칠하는 방법이 정확히 하나 있다.

  • 정점이 흰색인 것은 그 정점에 검은색 자식이 있는 경우, 그리고 그 경우뿐이다.

색칠이 유일하다는 사실은 귀납법으로 쉽게 증명할 수 있다. 이렇게 칠한 트리를 잘 칠한 트리라고 부른다.

검은색 정점 하나로 이루어진 트리에서 시작한다. 이 정점이 뿌리이다. 여기에 다음 연산을 nn번 수행한다.

  • add(v)add(v): 정점 vv의 자식으로 새로운 검은색 정점을 붙인다. 그다음 트리가 다시 잘 칠한 트리가 되도록 정점 몇 개의 색을 반전시킨다. 하나도 반전시키지 않을 수도 있고, 전부 반전시킬 수도 있다.

각 연산에서 색이 반전되는 정점이 몇 개인지 구하라.

입력

뿌리의 번호는 00이고, 나머지 정점은 트리에 추가되는 순서대로 1,2,,n1, 2, \dots, n번을 받는다.

첫째 줄에 정점을 추가하는 횟수 nn이 주어진다. (1n2000001 \le n \le 200000)

다음 nn개 줄 중 ii번째 줄에는 ii번째 연산에서 추가하는 정점의 부모 번호 viv_i가 주어진다. 정점 viv_iii번째 연산 전에 이미 존재한다. 즉, vi<iv_i < i이다.

출력

nn개 줄을 출력한다. ii번째 줄에는 ii번째 연산에서 색이 반전되는 정점의 개수를 출력한다. 그 연산에서 새로 붙인 정점은 검은색으로 붙었고 잎은 항상 검은색이므로, 반전되는 정점에 들어가지 않는다.

힌트

아래 그림은 첫 번째 예제의 시작 트리와 각 연산을 마친 뒤의 트리이다. 그 연산에서 색이 반전된 정점을 빨간 테두리로 표시했다.

첫 번째 예제의 트리 여섯 개. 시작 트리와 다섯 연산 각각을 마친 뒤의 트리이고, 그 연산에서 색이 반전된 정점에 빨간 테두리가 있다.