AT_kupc2020_l Inside Story of Median Query
Description
[problemUrl]: https://atcoder.jp/contests/kupc2020/tasks/kupc2020_l
**これはインタラクティブな要素がある問題です。**
Alice は $ 1 $ から $ N $ までの整数を並び替えた順列を隠し持っています。Alice には Bob という友達がいます。Bob は隠し事が嫌いなので、この順列を特定しようと質問してくることが予想されます。その質問をなるべくかわして特定されないようにするため、Alice は Oscar と模擬訓練を行って練習することにしました。
模擬訓練は質問フェーズと解答フェーズからなります。質問フェーズでは、Alice は順列に関するいくつかの質問に答えなければなりません。その後の解答フェーズでは、質問の解答に矛盾しない順列 $ a_1,\ a_2,\ \ldots,\ a_N $ を $ 2 $ つ構成しなければなりません。
質問フェーズでは、いくつかの質問が与えられるので順番に答えてください。はじめ、Oscar のスタミナ $ S $ は $ 2N $ であり、質問するたびにスタミナを消費します。質問には **$ 3 $** 種類あり、以下の形式で与えられます。
- タイプ $ 1 $: $ 3 $ つの相異なる整数 $ i,j,k $ が与えられる。$ 3 $ つの整数 $ a_i,a_j,a_k $ の中央値となるべき整数 $ m $ を回答せよ。$ m $ は $ 1 $ 以上 $ N $ 以下でなければならない。この質問をすると Oscar のスタミナ $ S $ は $ 2 $ 減少する。
- タイプ $ 2 $: $ 2 $ つの異なる整数 $ i,j $ が与えられる。$ a_i\ \ a_j $ となるべきであれば $ j $ を回答せよ。この質問をすると Oscar のスタミナ $ S $ は $ 2 $ 減少する。
- タイプ $ 3 $: $ 2 $ つの異なる整数 $ i,j $ が与えられる。$ a_i,a_j $ の最小値となるべき整数 $ x $ を回答せよ。$ x $ は $ 1 $ 以上 $ N $ 以下でなければならない。この質問をすると Oscar のスタミナ $ S $ は $ 1 $ 減少する。
質問には必ず答える必要があります。また、Oscar は疲れてしまうので、 **質問した後に Oscar のスタミナ $ S $ が $ 2 $ 以下になることはありません。**
質問フェーズが終了すると、解答フェーズとなります。
解答フェーズでは、$ 2 $ つの $ 1 $ から $ N $ までの整数を並び替えた順列 $ a_1,\ a_2,\ \ldots,\ a_N $ と $ b_1,\ b_2,\ \ldots,\ b_N $ を Oscar に伝えます。この $ 2 $ つの順列は、それぞれの質問フェーズでのすべての回答に矛盾しない順列であり、$ a_i\ \neq\ b_i $ となる $ i $ の個数が $ \left\lceil\ \frac{S}{2}\ \right\rceil $ 以上であれば、Oscar は混乱します。ここでの $ S $ は、Oscar がすべての質問を終えた後のスタミナです。Oscar が混乱するような $ 2 $ つの順列を伝えることができれば Alice の勝ちです。このような $ 2 $ つの順列を構成できることが証明できます。
Alice にとって Oscar が混乱するような $ 2 $ つの順列を探し出すのは非常に難しく、意気消沈してしまいました。どのような質問が来ても Oscar が混乱するような $ 2 $ つの順列を出力するプログラムを作成し、Alice を元気づけてください。
### Input & Output Format
最初に順列のサイズ $ N $ が $ 1 $ 行で与えられる。
> $ N $
その後、タイプ $ 1,2,3 $ の質問、もしくは解答フェーズの開始を表す記号が入力として与えられる。
タイプ $ 1 $ の質問は以下の形式で与えられる。
> ? $ 1 $ $ i $ $ j $ $ k $
$ i,j,k $ は $ 1 $ から $ N $ までの相異なる整数である。
次に、質問への回答を以下の形式で出力すること。
> $ m $
$ m $ は $ 1 $ から $ N $ までの整数でなければならない。さらに、これは $ a_i,a_j,a_k $ の $ 3 $ つの整数の中央値であり、$ b_i,b_j,b_k $ の $ 3 $ つの整数の中央値である必要がある。末尾には改行を出力すること。
タイプ $ 2 $ の質問は以下の形式で与えられる。
> ? $ 2 $ $ i $ $ j $
$ i,j $ は $ 1 $ から $ N $ までの相異なる整数である。
次に、質問への回答を以下の形式で出力すること。
> $ p $
$ p $ は $ i $ または $ j $ の整数でなければならない。さらに、$ p=i $ であれば $ a_i\ \ b_j $ である必要がある。末尾には改行を出力すること。
タイプ $ 3 $ の質問は以下の形式で与えられる。
> ? $ 3 $ $ i $ $ j $
$ i,j $ は $ 1 $ から $ N $ までの相異なる整数である。
次に、質問への回答を以下の形式で出力すること。
> $ x $
$ x $ は $ x=\min(a_i,a_j)=\min(b_i,b_j) $ を満たす必要がある。末尾には改行を出力すること。
解答フェーズに移るとき、以下の形式で解答フェーズの開始を表す記号が与えられる。
```
!
```
この後、 $ 2 $ つの順列を以下の形式で出力すること。
> $ a_1 $ $ a_2 $ $ \cdots $ $ a_N $ $ b_1 $ $ b_2 $ $ \cdots $ $ b_N $
Bob の残りのスタミナが $ S $ の時、順列 $ a_i\ \neq\ b_i $ となる $ i $ の個数が $ \left\lceil\ \frac{S}{2}\ \right\rceil $ 以上である必要がある。末尾には改行を出力すること。 $ 2 $ つの順列を出力した後、あなたのプログラムは直ちに終了しなければならない。終了しなかった場合のジャッジ結果は不定である。
また、これら以外のフォーマットで出力した場合のジャッジ結果も不定である。
各出力の後には、出力をフラッシュする必要があることに注意せよ。例えば、タイプ $ 1 $ の質問に対して答える際、 C では
```
printf("%d\n", m); fflush(stdout);
```
C++ では
```
cout
Input Format
N/A
Output Format
N/A
Explanation/Hint
### 制約
- $ 4\ \leq\ N\ \leq\ 5\ \times\ 10^4 $
- $ N $ は整数
### 入出力例
以下のような入出力が考えられる。
解答プログラムの出力 解答プログラムへの入力 説明 $ 5 $ 順列のサイズ $ 5 $ が入力として与えられる。Bob のスタミナは $ 10 $ である。 ? $ 1 $ $ 1 $ $ 2 $ $ 3 $ タイプ $ 1 $ の質問がされる。Bob のスタミナは $ 8 $ となる。 $ 4 $ $ a_1,\ a_2,\ a_3 $ の中央値が $ 4 $ である順列がこの質問に合致する。 ? $ 2 $ $ 2 $ $ 4 $ タイプ $ 2 $ の質問がされる。Bob のスタミナは $ 6 $ となる。 $ 4 $ $ a_2\ >\ a_4 $ となる順列がこの質問に合致する。 ? $ 3 $ $ 4 $ $ 5 $ タイプ $ 3 $ の質問がされる。Bob のスタミナは $ 5 $ となる。 $ 1 $ $ \min(a_4,\ a_5)=1 $ となる順列がこの質問に合致する。 ! 解答フェーズに入る。 $ 3 $ $ 5 $ $ 4 $ $ 1 $ $ 2 $
$ 5 $ $ 4 $ $ 3 $ $ 2 $ $ 1 $ 2 つの順列 "$ 3,5,4,1,2 $" と "$ 5,4,3,2,1 $" を出力している。これは共に質問フェーズでのすべての回答に矛盾せず、$ \lceil\ 5/2\ \rceil\ =\ 3 $ 個以上の要素が異なるので正解となる。これは入出力の一つの例であり、意味のある入出力をしているとは限らない。