003 - ボゾソート
時間制限 2 秒 / メモリ制限 256 MB / 得点 6 / x 5 /
問題文
ボゾソートはボゴソートと並んで極めて効率の悪い整列アルゴリズムである。ボゾソートは乱数に基づくアルゴリズムで、以下の手順で数列の要素を整列する:
- 2つの要素をランダムに選び、交換する。
- 全ての要素が昇順に整列されているか確認する。
- 整列されていれば終了。そうでなければ1.へ戻る。
課題
整数の数列に対して2つの要素を交換する命令がいくつか与えられる。何回目の命令で数列が昇順になるかを求めるプログラムを作成せよ。
入力・出力
入力
入力は以下の形式で与えられる。
N a1 a2 … aN Q x1 y2 x1 y2 : xQ yQ
1行目に数列の要素数N(2≦N≦300,000)が与えられる。続く1行に、数列の各要素を表す整数ai(1≦ai≦109)が与えられる。3行目に命令の個数Q(1≦Q≦300,000)が与えられる。続くQ行にi番目の命令を表す2つの整数xi,yi(1≦xi,yi≦N)が与えられる。命令は数列のxi番目の要素とyi番目の要素を交換することを示す。ただし、xi≠yiである。
出力
最初に数列が昇順になる命令の番号を1行に出力する。ただし、最初から昇順に整列されている場合は0、全ての命令を処理しても昇順に出来ない場合は-1を出力する。
入出力例
入力例 1
6 9 7 5 6 3 1 3 1 6 2 5 3 4
出力例 1
2
入力例 2
4 4 3 2 1 2 1 2 3 4
出力例 2
-1
入力例 3
5 1 1 1 2 2 1 1 2
出力例 3
0