这是一个交互式问题。
Endagorion 有一棵包含 $n$ 个顶点的树,并且他已经向你展示了这棵树。他选择了一个顶点 $u$ 作为特殊顶点,但现在他不会告诉你关于它的任何信息!
你可以向他提问。对于每次询问,你需要选择一个顶点 $x$、一个整数 $k$ 以及 $k$ 个顶点 $v_1, v_2, \dots, v_k$,他会告诉你 $\min_{i=1}^k (\text{dist}(u, v_i)) \ge \text{dist}(u, x)$ 是否成立。其中,$\text{dist}(p, q)$ 是树中顶点 $p$ 和 $q$ 之间简单路径上的边数。
你需要使用最多 $4 \lceil \log_2 n \rceil$ 次询问猜出这个特殊顶点。
Endagorion 非常诚实,因此他不会在你的询问之间更改顶点(换句话说,交互器不是自适应的)。
由于数据规模较大,且刷新(flush)操作代价昂贵,请确保不要过于频繁地刷新。你只能在每次询问后刷新一次。
交互
交互开始时,输入包含一个整数 $n$:Endagorion 树的顶点数($2 \le n \le 200\,000$)。
接下来的 $n-1$ 行,每行包含两个整数 $u$ 和 $v$($1 \le u, v \le n$),表示 $u$ 和 $v$ 之间的一条边。保证给定的边构成一棵树。
之后,你可以进行询问。
要进行询问,请打印一行包含 “? $k$”($1 \le k \le n$)、一个整数 $x$($1 \le x \le n$)以及 $k$ 个不同的整数 $v_1, v_2, \dots, v_k$($1 \le v_i \le n$)。连续的整数之间用空格分隔。然后刷新输出。
每次询问后,读取一行,其中包含一个整数 $ans \in \{0, 1\}$。如果 $\min_{i=1}^k (\text{dist}(u, v_i)) \ge \text{dist}(u, x)$,则 $ans$ 为 $1$。否则,$ans$ 为 $0$。
当你找到特殊顶点 $u$($1 \le u \le n$)时,打印一行包含 “! $u$”,然后刷新输出并终止程序。
如果你进行的询问次数超过 $4 \lceil \log_2 n \rceil$,你的程序将获得 Wrong Answer 或 Time Limit Exceeded。如果你没有打印任何内容或忘记刷新输出,你的程序将获得 Idleness Limit Exceeded。
要刷新输出,你需要在打印询问和换行符后执行以下操作:
- C++:
fflush(stdout)或cout.flush(); - Java:
System.out.flush(); - Pascal:
flush(output); - Python:
stdout.flush(); - 其他语言请查阅相关文档。
样例
输入格式 1
5 1 2 1 3 1 4 1 5 1
输出格式 1
? 4 1 2 3 4 5 ! 1
输入格式 2
5 1 2 1 3 1 4 1 5 0 0 0 0
输出格式 2
? 4 1 2 3 4 5 ? 3 1 2 3 4 ? 2 1 2 3 ? 1 1 2 ! 2
输入格式 3
7 1 2 2 3 3 4 4 5 3 6 6 7 1
输出格式 3
? 3 3 5 7 1 ! 3