sparse tableメニューのサムネイル
Sparse Table の構築 Step 3 Elixir(Beta)編(paizaランク S 相当)

問題にチャレンジして、ユーザー同士で解答を教え合ったり、コードを公開してみよう!

問題

下記の問題をプログラミングしてみよう!

説明


前回の問題では、任意の長さの区間を 2 つの長さ 2^k の区間で覆う方法を勉強しました。
次に、任意の長さの区間の最小値を、2 つの長さ 2^k の区間の最小値から求めることを目指します。
まずはじめに、各 i について「i から始まる長さ 2^k の区間の最小値」を求めておきます(k は数列の長さを超えないところまで考えるとします)。
「i から始まる長さ 2^k の区間の最小値 (min(A_i, A_{i+1}, ..., A_{i+2^k-1}))」を T_{i,k} と表すことにします。
以下の画像の直線が T_{i,k} の区間を表しています。


例えば、N = 8、A = [4, 2, 5, 6, 1, 3, 7, 8] で区間 [1,7) の最小値を求めることを考えます。
対象となる区間の値は [A_1, A_2, A_3, A_4, A_5, A_6] = [2, 5, 6, 1, 3, 7] です。
前回の問題と同様に考えると、区間 [1,7) は長さ 2^2 = 4 の区間 [1,5) と [3,7) で覆うことができます。
区間 [1,5) の最小値は T_{1,2}、[3,7) の最小値は T_{3,2} であることを思い出すと、
min(A_1, A_2, A_3, A_4, A_5, A_6)
= min(A_1, A_2, A_3, A_4, A_3, A_4, A_5, A_6)
= min(min(A_1, A_2, A_3, A_4), min(A_3, A_4, A_5, A_6))
= min(T_{1,2}, T_{3,2})
と変形でき、2 べきの長さの区間の答えを 2 つ組み合わせることで答えが求められることがわかります。
これは任意の長さの区間に対しても同様に成り立ちます。

なお今回の問題では、T_{i,k} は愚直に計算しても実行制限時間に間に合う制約になっています。

問題



長さ N の数列 A が与えられます。
ここで、数列の要素を 0-index で表すとします。
つまり、数列 A は A_0, A_1, ..., A_{N-1} です。

Q 個のクエリが与えられるので順に解答してください。クエリの形式は以下の通りです。
l r:数列 A の区間 [l,r) の最小値 min(A_l, A_{l+1}, ..., A_{r-1}) を出力する。

入力される値

入力は以下のフォーマットで与えられます。

N Q
A_0 A_1 ... A_{N-1}
l_1 r_1
l_2 r_2
...
l_Q r_Q


・1 行目には、数列の長さを表す整数 N とクエリの数を表す整数 Q が与えられます。
・2 行目には、数列 A が空白区切りで与えられます。
・続く Q 行の i 行目には i 個目のクエリが与えられます。クエリの形式は問題文の通りです。
・入力は合計で Q+2 行からなり、入力値最終行の末尾に改行が1つ入ります。


入力値最終行の末尾に改行が1つ入ります。
文字列は標準入力から渡されます。 標準入力からの値取得方法はこちらをご確認ください
期待する出力

期待する出力は Q 行からなります。
i 行目には i 個目のクエリに対する答えを出力してください。
最後は改行し、余計な文字、空行を含んではいけません。

条件

すべてのテストケースにおいて、以下の条件をみたします。

・1 ≦ N ≦ 10^3
・1 ≦ Q ≦ 10^5
・1 ≦ A_i ≦ 10^9
・0 ≦ l_i < r_i ≦ N

入力例1

8 4
11 4 8 9 17 15 1 15
2 3
0 6
7 8
0 8

出力例1

8
4
15
1

入力例2

10 5
357221345 297793846 249081889 774008963 337446848 807998522 939467374 430229875 407670825 723038147
2 6
2 5
8 10
1 9
0 7

出力例2

249081889
249081889
407670825
249081889
249081889

入力例3

20 8
93216434 820435381 53862906 371624214 576560211 8517594 701932984 178910783 284530185 807487472 719265989 880519708 972177254 685788526 694438592 358229038 798094583 192556030 477283337 316663206
6 19
8 16
1 8
14 19
4 7
4 12
2 14
3 12

出力例3

178910783
284530185
8517594
192556030
8517594
8517594
8517594
8517594

問題一覧へ戻る

  1. paizaラーニングトップ
  2. レベルアップ問題集
  3. sparse tableメニュー(言語選択)
  4. 問題一覧 Elixir(Beta)編
  5. Sparse Table の構築 Step 3 Elixir(Beta)編
ページの先頭へ戻る