녹아웃 토너먼트
시간 제한1초메모리 제한128 MB
토너먼트 결과가 주어질 때, 승패의 추이성을 가정하여 각 선수가 가질 수 있는 최고 순위와 최저 순위를 구한다.
문제
명의 선수가 참가하는 녹아웃(단판 탈락) 토너먼트가 있다. 한 번이라도 지면 그 선수는 탈락하고, 각 경기의 승자끼리 다시 맞붙어 마지막 한 명이 남을 때까지 진행한다.
선수에게 의 번호를 매기고, 1라운드에서는 에 대해 선수 과 가 맞붙는다고 하자. 그러면 토너먼트 전체 결과를 완전 이진 트리로 나타낼 수 있으며, 각 내부 노드에는 그 경기의 승자를 적는다.
예를 들어 인 토너먼트를 보자. 1라운드에서 의 승자는 1, 의 승자는 3, 의 승자는 5, 의 승자는 8이다. 2라운드에서 의 승자는 1, 의 승자는 8이다. 결승 의 승자는 1이므로 우승자는 선수 1이다.
토너먼트가 끝난 뒤, 기자들이 경기 결과로 정해지는 선수들의 상대적 순위를 두고 논쟁을 벌였다. 여기서 '이김'은 추이적이라고 가정한다. 즉 선수 A가 선수 B를 이기고 B가 C를 이겼다면 A도 C를 이긴 것으로 본다. 이렇게 하면 누가 최고의 선수인지는 의심의 여지가 없다.
문제는, 한 선수가 토너먼트 결과를 근거로 주장할 수 있는 가장 높은 순위와 가질 수 있는 가장 낮은(나쁜) 순위가 무엇인가 하는 것이다. 예를 들어 위 토너먼트에서 선수 2는 결국 우승한 선수에게만 졌으므로 자신이 전체 2위라고 주장할 수 있지만, 실제로는 최하위(8위)일 수도 있다. 선수 5는 (2위가 될 수도 있는 선수에게 졌으므로) 최고 3위까지 주장할 수 있지만, 1라운드에서 한 명을 이겼으므로 아무리 낮아도 7위보다 나쁠 수는 없다.
토너먼트 결과와 관심 있는 선수들의 목록이 주어질 때, 각 선수가 가질 수 있는 가장 높은 순위와 가장 낮은 순위를 구하여라.
입력
입력은 여러 개의 테스트 케이스로 이루어진다. 각 테스트 케이스는 세 줄로 구성된다.
첫째 줄에는 양의 정수 ()이 주어진다. 이는 토너먼트에 명의 선수가 있고 번부터 번까지 위에서 설명한 방식대로 짝지어짐을 뜻한다. 은 입력의 끝을 의미한다.
둘째 줄에는 1라운드부터 순서대로 각 라운드의 경기 결과가 (한 라운드 안에서는 왼쪽에서 오른쪽 순서로) 주어진다. 즉 1라운드의 승자 개, 2라운드의 승자 개, , 마지막 라운드의 승자 1개 순으로 총 개의 승자 번호가 나열된다. 예를 들어 앞의 토너먼트는 다음과 같이 주어진다.
1 3 5 8 1 8 1
셋째 줄에는 양의 정수 과 이어서 개의 정수 이 주어진다. 각 는 이 토너먼트에 참가한 선수의 번호이다.
출력
각 에 대해 다음 형식으로 한 줄씩 출력한다.
Player ki can be ranked as high as h or as low as l.
여기서 ki는 선수 번호, h는 그 선수가 주장할 수 있는 가장 높은 순위, l은 가질 수 있는 가장 낮은 순위이며, 각각 알맞은 수로 바꿔 출력한다. 출력 줄들은 입력에서 가 주어진 순서와 같은 순서로 나타나야 한다. 서로 다른 테스트 케이스의 출력 사이에는 빈 줄 하나를 넣어 구분한다.