Zillionim 是一个双人回合制游戏。初始时,有 $10^{12}$ 枚硬币首尾相连排成一行,从左到右编号为 $1$ 到 $10^{12}$。在每一回合中,玩家必须选择 $10^{10}$ 枚连续的硬币并将它们移除。原本不相邻的两枚硬币,即使它们中间的所有硬币都被移除了,也不会变得相邻。
在自己的回合,玩家若能进行有效操作则必须进行,随后轮到对手。如果玩家在自己的回合无法进行任何有效操作,则该玩家输掉游戏(对手获胜)。
由于我们的工程师仍在努力训练机器学习模型来玩 Zillionim,我们创建了一个简单的 AI,通过随机移动来玩 Zillionim。AI 总是先手。在 AI 的每一回合,它会确定所有可能的有效操作,并从中等概率随机选择一个。
你能击败这个 AI 吗……至少在大多数时候?
输入格式
这是一个交互式问题。请确保你已阅读 FAQ 中关于“交互式问题”的部分。
程序首先需要读取一行,包含两个整数 $T$(测试用例数量)和 $W$(为了使你的解法被视为正确,你需要赢得的最少游戏局数)。然后,你需要处理 $T$ 个测试用例,每个用例都是一场独立的 Zillionim 游戏。
每个测试用例通过与裁判进行交互来处理,直到一方获胜。在每次交互中,裁判首先输出一行,包含一个整数 $P$,其含义如下:
- 如果 $1 \le P \le 10^{12} - 10^{10} + 1$,则表示 AI 移除了编号为 $P, P + 1, \dots, P + 10^{10} - 1$ 的硬币,现在轮到你操作。注意,这意味着你至少还有一个有效的操作。AI 总是进行有效操作。
- 如果 $P = -2$,表示你上一步的操作使你赢得了当前游戏。
- 如果 $P = -3$,表示 AI 的操作使其赢得了当前游戏。注意,在这种情况下,裁判不会发送 AI 的最后一步操作。
- 如果 $P = -1$,表示你发送给裁判的信息格式错误或操作无效(超出范围或尝试移除不存在的硬币),这意味着你将因为操作不当而获得 Wrong Answer 判决。
在收到正整数 $P$ 后,你应该回传一行,包含一个正整数 $Q$ ($1 \le Q \le 10^{12} - 10^{10} + 1$),表示你移除了编号为 $Q, Q + 1, \dots, Q + 10^{10} - 1$ 的硬币。这些硬币中的每一枚在当前游戏中都必须是尚未被移除的。
在裁判发送 $-2$ 或 $-3$ 后,如果是最后一场游戏,裁判将终止,你的程序也应随之终止。否则,裁判将继续发送下一场游戏的第一步交互数据。裁判不会检查你赢了或输了多少场游戏,直到所有游戏都正确处理完毕。例如,如果你赢了 $T - 1$ 场游戏,但在最后一场游戏中发送了格式错误的数据,你将获得 Wrong Answer 判决,无论 $W$ 的值是多少。
在收到 $-1$ 后,你的程序应终止以接收 Wrong Answer 判决。如果程序在收到 $-1$ 后继续等待裁判,程序将会超时,导致 Time Limit Exceeded 错误。请注意,你有责任让程序正常退出并在时限内结束,以接收 Wrong Answer 判决,而不是 Runtime Error 或 Time Limit Exceeded。
随机数生成器的种子是预先确定的(且每场游戏不同)。这意味着在给定游戏中进行完全相同操作序列的两次提交,将从 AI 那里收到完全相同的操作序列。这也意味着 AI 在某场游戏中的表现,即使在伪随机生成的意义上,也不依赖于同一测试集中之前游戏的操作。
数据范围
时间限制:每个测试集 50 秒。 内存限制:1GB。 $T = 500$。 $-3 \le P \le 10^{12} - 10^{10} + 1$。 $P \neq 0$。 $P$ 代表一次有效操作或关于游戏状态的有效信息。
子任务
测试集 1(可见) $W = 300$。
测试集 2(可见) $W = 475$。
测试集 3(可见) $W = 499$。
样例
为简单起见,以下交互使用总共 50 枚硬币而不是 $10^{12}$,且每次移动移除 10 枚连续硬币而不是 $10^{10}$。规则其余部分相同。
样例交互
t, w = readline_int_list() // 读取 500 到 t,300 到 w
p = readline_int() // 读取 23 到 p;这是第一场游戏的开始。
// AI 已经移除了 23 到 32 号硬币(包含)。
printline 38 to stdout // 我们决定移除 38 到 47 号硬币(包含)
flush stdout
p = readline_int() // 读取 3 到 p。AI 已经移除了 3 到 12 号硬币(包含)。
printline 13 to stdout // 我们决定移除 13 到 22 号硬币(包含)
// (这是我们唯一剩下的操作!)
flush stdout
p = readline_int() // 读取 -2 到 p。我们赢得了第一场游戏,因为 AI 没有操作了。
p = readline_int() // 读取 32 到 p;这是第二场游戏的开始。
// AI 已经移除了 32 到 41 号硬币(包含)。
printline 13 to stdout // 我们决定移除 13 到 22 号硬币(包含)
flush stdout
p = readline_int() // 读取 -3 到 p。我们不知道 AI 的操作,但它让我们
// 没有了有效操作,所以我们输掉了第二场游戏。
p = readline_int() // 读取 10 到 p;这是第三场游戏的开始。
// AI 已经移除了 10 到 19 号硬币(包含)。
printline 0 to stdout // 我们选择了一个无效索引(硬币编号从 1 开始!)
flush stdout
p = readline_int() // 读取 -1 到 p -- 我们犯了一个错误!
exit // 退出以避免歧义的 TLE 错误