你需要对 $N$ 个不同的项 $x_1, x_2, \dots, x_N$ 进行排序。遗憾的是,你无法直接比较其中任意两项。你唯一能做的是,给定三个项,找出哪一个是中位数,即这三个项中既不是最小值也不是最大值的那一个。
例如,假设 $N = 5$,且你知道: $x_1$ 是 $\{x_1, x_2, x_3\}$ 的中位数 $x_2$ 是 $\{x_2, x_3, x_4\}$ 的中位数 * $x_3$ 是 $\{x_3, x_4, x_5\}$ 的中位数
那么,可以保证元素的排序顺序要么是 $x_4, x_2, x_1, x_3, x_5$,要么是其反序 $x_5, x_3, x_1, x_2, x_4$。请注意,仅通过中位数信息,无法区分一个列表与其反序,因为对于任何三个元素,中位数查询在这两种情况下得到的结果相同。
你的程序需要找出 $T$ 个包含 $N$ 个元素的列表的顺序,总共最多使用 $Q$ 次中位数查询(或者说平均每个列表使用 $Q/T$ 次查询)。在每种情况下,找到正确的顺序或其反序均被视为正确。每种情况下的顺序都是从所有可能的顺序中均匀随机生成的,且与其他任何信息无关。
输入格式
这是一个交互式问题。请确保你已阅读过 FAQ 中关于交互式问题的相关信息。
最初,评测系统会发送一行,包含三个整数 $T, N, Q$:分别为测试用例的数量、每个测试用例中需要排序的元素数量,以及你在所有测试用例中允许使用的查询总数。然后,你必须处理 $T$ 个测试用例。每个测试用例由一系列查询交换以及一个用于提供答案的额外交换组成。
对于一次查询交换,你的程序必须打印一行,包含三个不同的整数 $i, j, k$(均在 $1$ 到 $N$ 之间,包含边界),这对应于询问评测系统“集合 $\{x_i, x_j, x_k\}$ 中的中位数是哪一个?”。评测系统将回复一行,包含一个整数 $L$,表示该集合的中位数是 $x_L$($L$ 总是等于 $i, j, k$ 中的一个)。如果你尝试执行第 $(Q + 1)$ 次查询交换,评测系统将直接输出 $-1$。
当你准备好给出结果时,打印一行,包含 $N$ 个整数,表示按排序顺序或反序排列的元素下标。如果你的答案正确,评测系统将回复一个整数 $1$,如果不正确,则回复 $-1$。在收到第 $T$ 个测试用例的评测结果后,你的程序必须及时结束,以避免收到超时错误(Time Limit Exceeded)。此外,如果你在收到第 $T$ 个测试用例的结果后打印了额外信息,你将得到错误答案(Wrong Answer)的判决。
如果评测系统在任何时刻收到格式错误的行或无效值,它将打印一个数字 $-1$。在评测系统因上述任何原因打印 $-1$ 后,它将不再输出任何内容。如果你的程序在收到 $-1$ 后继续等待评测系统,程序将会超时,导致超时错误。
数据范围
时间限制:40 秒。 内存限制:1 GB。 $T = 100$。
子任务 1(可见判决)
$N = 10$。 $Q = 300 \cdot T$。
子任务 2(可见判决)
$N = 50$。 $Q = 300 \cdot T$。
子任务 3(隐藏判决)
$N = 50$。 $Q = 170 \cdot T$。
样例
样例 1
2 5 600
1 2 3
2
4 2 3
3
5 4 3
4
5 4 3 2 1
1
样例 2
1 2 3
3
2 3 4
4
3 4 5
5
1 3 5 4 2
1