這是一道互動題
相信你們已經幾個月沒有見過 CZL 了吧,他又回來了!我們成功地把小 U、小 Z、CZL 這三個人放在了一套題目裡面。
CZL 有一副打亂的牌,這副牌從上到下有 $n$ 張牌(牌的位置從 $0$ 開始編號),其中大小為 $0, 1, 2, \dots, n-1$ 中的一個,且不同牌的大小互不相同。現在,你要問出這副牌裡面每一張的大小,但是大魔術師怎麼能夠直接告訴你呢?
一開始,CZL 的左手和右手都停留在第 $0$ 張牌的位置。每次你可以指定讓他的左手向上移動一張牌,或者向下移動一張牌。你也可以讓他的右手向上移動一張牌,或者向下移動一張牌。你還可以向他詢問左手的牌是否比右手的牌要小。透過這些操作,你需要得到這副牌裡面從上到下每一張牌的大小。
雖然 CZL 的手很靈活,但是他還要給別的人表演魔術。所以,請你在不超過 $7.0 \cdot 10^8$ 次移動內,得到這副牌從上到下每一張牌的大小。
你的程式碼必須包含一個標頭檔 "lancllords.h",你需要實作一個函式:
vector<int> answer(int n);
這個函式中正整數 $n$ 表示牌的個數。這個函式需要回傳一個長度為 $n$ 的陣列 $P$,其中 P[i] 表示從上到下第 $i$ 張牌的大小。
我們假設 CZL 的左手在第 $p$ 張牌的位置,右手在第 $q$ 張牌的位置。你可以呼叫如下函式:
void inc_p();
表示將 CZL 的左手向下移動一張牌的位置。
void dec_p();
表示將 CZL 的左手向上移動一張牌的位置。
void inc_q();
表示將 CZL 的右手向下移動一張牌的位置。
void dec_q();
表示將 CZL 的右手向上移動一張牌的位置。
bool cmp();
表示比較第 $p$ 張牌的大小和第 $q$ 張牌的大小。若第 $p$ 張牌比第 $q$ 張牌小,則回傳 true,否則回傳 false。
你每呼叫了前 $4$ 個函式,grader 的變數 $cnt$ 將增加 $1$。最終評測時,如果 $cnt$ 的值過大,該測試點算作不通過。你需要時刻保證 $0 \le p, q < n$,否則該測試點也算作不通過。
注意互動庫在前四個函式呼叫次數不超過 $7.0 \cdot 10^8$,第五個函式呼叫次數不超過 $10^7$ 的情況下,用時不超過五秒,也就是說你的程式碼有至少五秒的時間。
我們下發了 grader.cpp、lancllords_sample.cpp 這兩個檔案,其中 lancllords_sample.cpp 是一個選手程式碼的範例。你可以透過指令 g++ lancllords.cpp grader.cpp -o lancllords -O2 來測試你的程式。
輸入格式
第一行讀入一個正整數 $n$,表示牌的個數。
接下來一行 $n$ 個數 $P_0, \dots, P_{n-1}$,表示從上往下第 $i$ 張牌的大小。
輸出格式
由互動庫輸出資訊。在選手本地測試時,如果你中間 $p, q$ 的值越界了,那麼會輸出 "Out of bound!"。如果你回傳的答案錯誤,會輸出 "Wrong answer!",否則輸出一行 "Right Output!",另一行表示你呼叫前四個函式的次數。
我們下發檔案中的互動庫與最終互動庫是不同的!但是最終的測試方式裡面,排列仍然是預先生成好的,不會因你的詢問而改變!
範例
範例輸入 1
5 3 4 0 1 2
範例輸出 1
Right Output! You use 100 operations!
說明 1
這個範例表示你呼叫了 $100$ 次前四個函式,最終得到了正確的排列。
範例 2
見下發檔案。
範例 3
見下發檔案。
子任務
對於所有資料 $1 \le n \le 150000$。
Subtask $1$ ($6$ pts): $n \le 1000$
Subtask $2$ ($7$ pts): $n \le 10000$
Subtask $3$ ($38$ pts): $n \le 30000$
Subtask $4$ ($25$ pts): $n \le 50000$
Subtask $5$ ($24$ pts): $n \le 150000$