#P1241. Knockout Tournament

Knockout Tournament

描述

在一个淘汰赛中有 (2^n) 名选手。每输掉一场比赛,选手就会被淘汰出局。胜者继续与其他胜者比赛,直到最后只剩下一名冠军。如果我们将选手编号为 1, 2, 3, ..., (2^n),且第一轮的配对为 (2k-1) 对 (2k)(其中 (k = 1, 2, ..., 2^{n-1})),那么我们可以用一个完全二叉树来表示比赛结果。树的内部节点表示比赛的胜者。下面是一个 (n=3) 的比赛示例。

![](file://eS48NJIb.png?type=additional_file)

比赛结束后,一些记者在讨论选手的相对排名(根据比赛结果确定的)。假设如果选手 A 击败选手 B,选手 B 击败选手 C,那么选手 A 也能击败选手 C;也就是说,胜负关系具有传递性。现在毫无疑问谁是冠军。问题是:根据比赛结果,一个选手可以合理地声称的最高排名是多少?以及可能的最低排名是多少?例如,在上述比赛中,选手 2 输给了最终冠军,可以声称自己是第二好的选手,但也可能是最差的(排名第 8)。选手 5 可以声称最高排名第 3(输给了可能是第 2 的选手),但最低不会低于第 7(因为在第一轮击败了一名选手)。

你需要根据比赛结果,确定一组选手在比赛中的最高和最低可能排名。

输入

输入包含多个测试用例。每个测试用例有三行:

  • 第一行是一个正整数 (n < 8),表示比赛中有 (2^n) 名选手,编号从 1 到 (2^n),配对方式如上所述。(n = 0) 表示输入结束。
  • 第二行是每一轮比赛的结果(从左到右列出),从第一轮开始。例如,上述比赛的结果为:
    1 3 5 8 1 8 1
    
  • 第三行是一个正整数 (m),后跟 (m) 个整数 (k_1, k_2, ..., k_m),表示需要查询排名的选手编号。

输出

对于每个 (k_i),输出一行:

Player ki can be ranked as high as h or as low as l.

其中 (h) 和 (l) 是具体的数字。输出的顺序应与输入的 (k_i) 顺序一致。不同测试用例的输出之间用空行分隔。

示例输入 1

3
1 3 5 8 1 8 1
2 2 5
4
2 3 6 7 9 11 14 15 3 6 9 15 6 9 6
4 1 15 7 6
0

示例输出 1

Player 2 can be ranked as high as 2 or as low as 8.
Player 5 can be ranked as high as 3 or as low as 7.

Player 1 can be ranked as high as 4 or as low as 16.
Player 15 can be ranked as high as 3 or as low as 13.
Player 7 can be ranked as high as 2 or as low as 15.
Player 6 can be ranked as high as 1 or as low as 1.

来源

East Central North America 2002