TUNA2026 東京Stage Welcome コンテスト 2026/09/23 14:00 ~ 2026/09/23 18:00 4:00:00

F Find the Edge

問題
制限時間: 2 sec メモリ制限: 1024 MB
Find the Edge
Statement

\(N\) 頂点の木があります。頂点には \(1\) から \(N\) までの番号が付いています。 頂点 \(i\) には整数 \(A_i\) が書かれており、\(A_i\) は \(0\) または \(1\) です。

Alice と Bob の \(2\) つのプログラムが協力して、両端に異なる整数が書かれた辺を \(1\) 本見つけます。 ただし、そのような辺が存在しない場合は、そのことを報告します。

はじめ、Alice は木の辺をすべて知っていますが、数列 \(A\) を知りません。 一方、Bob は数列 \(A\) を知っていますが、木の辺を知りません。 \(N\) は Alice と Bob の両方に知らされています。

Alice と Bob は、次の順に通信できます。

  1. Alice から Bob へ、\(1,2,\ldots,N\) の順列を \(1\) つ送る。
  2. Bob から Alice へ、\(1\) 以上 \(N\) 以下の整数を \(1\) つ送る。
  3. Alice から Bob へ、\(1\) 以上 \(N\) 以下の整数を \(1\) つ送る。
  4. Bob が答えを出力する。

どのような木と数列 \(A\) が与えられても正しい答えを出力するプログラムを作成してください。

制約

  • \(1 \leq N \leq 200\,000\)
  • \(1 \leq u_i,v_i \leq N\)
  • 与えられるグラフは木
  • \(A_i \in \{0,1\}\)
  • 入力される値はすべて整数

Interaction

この問題はインタラクティブ問題です。 Alice として振る舞うあなたのプログラムと、Bob として振る舞うあなたのプログラムが、ジャッジプログラムを介して通信します。

あなたのプログラムは、最初に以下の形式で入力を受け取ってください。

\(\mathrm{Player}\)
\(N\)

ここで、\(\mathrm{Player}\) は文字列 Alice または文字列 Bob です。

  • \(\mathrm{Player} = \)Alice の場合、あなたのプログラムは Alice として振る舞います。
  • \(\mathrm{Player} = \)Bob の場合、あなたのプログラムは Bob として振る舞います。

Alice として振る舞うプログラムだけが、続いて木の辺を以下の形式で入力として受け取ります。

\(u_1\)\(v_1\)
\(u_2\)\(v_2\)
\(\vdots\)\(\vdots\)
\(u_{N-1}\)\(v_{N-1}\)

Bob として振る舞うプログラムだけが、続いて数列 \(A\) を以下の形式で入力として受け取ります。

\(A_1\)\(A_2\)\(\ldots\)\(A_N\)

まず、Alice は \(1,2,\ldots,N\) の順列 \(P=(P_1,P_2,\ldots,P_N)\) を、以下の形式で出力してください。

\(P_1\)\(P_2\)\(\ldots\)\(P_N\)

Bob は、Alice が出力した順列を同じ形式で入力として受け取ります。 続いて、Bob は \(1\) 以上 \(N\) 以下の整数 \(K\) を以下の形式で出力してください。

\(K\)

Alice は、Bob が出力した整数 \(K\) を入力として受け取ります。 続いて、Alice は \(1\) 以上 \(N\) 以下の整数 \(X\) を以下の形式で出力してください。

\(X\)

Bob は、Alice が出力した整数 \(X\) を入力として受け取ります。 最後に Bob は答えを出力します。

両端に異なる整数が書かれた辺 \((a,b)\) を見つけた場合、以下の形式で出力してください。

\(a\)\(b\)

そのような辺が存在しない場合、以下の形式で出力してください。

\(-1\)

答えを出力した後、プログラムを直ちに終了してください。答えに対する応答はありません。

出力形式が不正である場合、順列が条件を満たさない場合、範囲外の整数を出力した場合、または答えが誤っている場合、ジャッジ結果は Wrong Answer となります。 相手のプログラムの出力が不正であった場合、入力として \(-1\) が与えられることがあります。その場合、ただちにプログラムを終了してください。

Note

  • 出力を行うたびに、末尾に改行を入れて標準出力を flush してください。例えば、C++ では cout << endl;、Java では System.out.flush();、Python では print(..., flush=True) を利用できます。
  • ジャッジプログラムと、Alice として振る舞うあなたのプログラムと、Bob として振る舞うあなたのプログラムが同時に実行されます。実行時間・使用メモリはこれらの合計で計測されるため、実行時間・使用メモリには余裕を持ってください。

入出力例

\(N=5\)、木の辺が \((1,2),(1,3),(3,4),(3,5)\)、\(A=(0,0,1,0,1)\) の場合の通信例を示します。

Alice の入力Alice の出力Bob の入力Bob の出力説明
AliceBobそれぞれの役割が与えられます。
55両方に \(N\) が与えられます。
1 20 0 1 0 1Alice に木が、Bob に \(A\) が与えられます。
1 3
3 4
3 5
1 2 3 4 5Alice が順列を送ります。
1 2 3 4 5Bob が順列を受け取ります。
3Bob が整数を \(1\) つ送ります。
3Alice が整数を受け取ります。
1Alice が整数を \(1\) つ送ります。
1Bob が整数を受け取ります。
1 3Bob が答えを出力します。

この例は説明のためのものであり、正しい通信方法がこの例に限られるわけではありません。