Smallest and Largest Subarray

作成者 loop0919

難易度(作成者設定) Lv.5

実行時間制限
2 秒
メモリ制限
512 MiB

問題文

この問題は インタラクティブな問題(あなたの作成したプログラムとジャッジシステムが入出力を介して対話を行う形式の問題)です。
また、問題文のパラメータは N=1000, Q=1500N = 1000, ~ Q = 1500 で固定されています。

正整数 N,QN, Q が与えられます。
ジャッジシステムは長さ NN の整数列 A=(A1,A2,,AN)A = (A_1, A_2, \cdots, A_N) を隠し持っています。

あなたは AA の各要素の値を直接知ることはできませんが、ジャッジシステムに対して質問を高々 QQ行うことができます。
11 回の質問は以下の通りです。

1lrN1 \le l \le r \le N かつ 1lrN1 \le l' \le r' \le N を満たす整数 l,r,l,rl, r, l', r' を選び、以下の命題の真偽を尋ねる。

  • (Al,Al+1,Ar)(A_l, A_{l + 1} \cdots, A_r)(Al,Al+1,,Ar)(A_{l'}, A_{l' + 1}, \cdots, A_{r'}) よりも辞書順で真に小さい。

高々 QQ 回の質問が完了した後、 AA の連続部分列のうち辞書順で最小のものの区間と最大のものの区間をそれぞれ 11 つずつ求めてください。

ただし、答えが複数ある場合、それらのうちいずれを答えても正解と判定されます。

数列の辞書順とは

数列 S=(S1,S2,,SS)S = (S_1, S_2, \cdots, S_{|S|}) が数列 T=(T1,T2,,TT)T = (T_1, T_2, \cdots, T_{|T|}) より辞書順で小さいとは、下記の 1. と 2. のどちらかが成り立つことを言います。

  1. S<T|S| \lt |T| かつ (S1,S2,SS)=(T1,T2,,TS)(S_1, S_2, \cdots S_{|S|}) = (T_1, T_2, \cdots, T_{|S|}).
  2. ある整数 1imin(S,T)1 \le i \le \min(|S|, |T|) が存在して, 下記のすべてが成り立つ.
    • (S1,S2,,Si1)=(T1,T2,,Ti1)(S_1, S_2, \cdots, S_{i - 1}) = (T_1, T_2, \cdots, T_{i - 1}).
    • SiS_iTiT_i より(数として)小さい.

制約

  • N=1000\color{red}N = 1000
  • Q=1500\color{red}Q = 1500
  • 1AiN(1iN)1 \leq A_i \leq N \enspace (1 \leq i \leq N)
  • AiA_i は整数

入出力

この問題はインタラクティブな問題(あなたの作成したプログラムとジャッジシステムが入出力を介して対話を行う形式の問題)です。

最初に、 N,QN, Q を標準入力から受け取ってください。

NQN \quad Q

次に、 AA の連続部分列のうち辞書順で最小となるものの区間と最大となる区間が特定できるまで、質問を繰り返してください。

質問は以下の形式で標準出力に出力してください。ここで、 l,r,l,rl, r, l', r'1lrN1 \le l \le r \le N かつ 1lrN1 \le l' \le r' \le N を満たす必要があります。

?lrlr\text{?} \quad l \quad r \quad l' \quad r'

これに対する応答は、次の形式で与えられます。

XX

ここで、 XX は質問に対する答えとなる整数であり、それぞれ以下のように説明されます。

  • X=1X = 1 のとき、命題「 (Al,Al+1,,Ar)(A_l, A_{l + 1}, \cdots, A_r)(Al,Al+1,,Ar)(A_{l'}, A_{l' + 1}, \cdots, A_{r'}) より辞書順で真に小さい」がである。
  • X=0X = 0 のとき、命題「 (Al,Al+1,,Ar)(A_l, A_{l + 1}, \cdots, A_r)(Al,Al+1,,Ar)(A_{l'}, A_{l' + 1}, \cdots, A_{r'}) より辞書順で真に小さい」がである。
  • X=1X = -1 のとき、不正な出力をしたか、質問回数が QQ 回を超えた。

ジャッジシステムの応答が -1 であった場合、すでに不正解とみなされています。この場合、ただちにプログラムを終了してください。

AA の連続部分列のうち、辞書順で最小のもの(Al,Al+1,,Ar)(A_l, A_{l + 1}, \cdots, A_r)最大のもの(AL,AL+1,,AR)(A_L, A_{L + 1}, \cdots, A_R) であると特定できたとき、整数 l,r,L,Rl, r, L, R を以下の形式で標準出力に出力してください。

ただち、この出力は質問回数に計上されません。また、答えが複数あるとき、それらのうちいずれを出力しても正解と判定されます。

!lrLR! \quad l \quad r \quad L \quad R

その後、ただちにプログラムを終了してください。

注意点

  • 出力を行うたびに、末尾に改行を入れて標準出力を flush してください。そうしなかった場合、ジャッジ結果が TLE になる可能性があります。
  • 解答を出力したら(または -1 を受け取ったら)ただちにプログラムを終了してください。そうしなかった場合、ジャッジ結果は不定です。
  • 余計な改行は不正なフォーマットの出力とみなされることに注意してください。

入出力例

入出力例 1

N=3,Q=5N = 3, Q = 5 であり、ジャッジシステムが A=(2,3,1)A = (2, 3, 1) を隠し持っているとします。その場合、対話の一例は以下の通りです。

なお、この例は制約を満たさないので、ジャッジには含まれないことに注意してください。

入力 出力 説明
3 5 N,QN, Q が入力されます。
? 2 2 3 3 命題「(A2)(A_2)(A3)(A_3) より辞書順で小さい」の真偽を質問します。
0 (3)(3)(1)(1) より辞書順で小さくない(大きいまたは等しい)ため偽です。応答として 00 が与えられます。
? 1 3 2 3 命題「(A1,A2,A3)(A_1, A_2, A_3)(A2,A3)(A_2, A_3) より辞書順で小さい」の真偽を質問します。
1 (2,3,1)(2, 3, 1)(3,1)(3, 1) より辞書順で小さいため真です。応答として 11 が与えられます。
? 1 2 3 3 命題「(A1,A2)(A_1, A_2)(A3)(A_3) より辞書順で小さい」の真偽を質問します。
0 (2,3)(2, 3)(1)(1) より辞書順で小さくない(大きいまたは等しい)ため偽です。応答として 00 が与えられます。
! 3 3 2 3 AA の連続部分列のうち辞書順で最小のものが (A3)(A_3)、最大のものが (A2,A3)(A_2, A_3) であると解答します。

インタラクティブ問題:標準入出力でジャッジと対話します。応答を待つ前に出力をflushしてください。