あなたの質問を理解する方法は、固定配列で前処理を行い、最大検索操作を非常に高速にすることです。
この回答は、O(nlogn) 前処理作業を行い、その後に各クエリに対して O(1) 作業を行うアプローチについて説明しています。
前処理 O(nlogn)
アイデアは、2 つの 2 次元配列 BIG[a,k] と SMALL[a,k] を準備することです。
1. BIG[a,k] is the max of the 2^k elements starting at a
2. SMALL[a,k] is the min of the 2^k elements starting at a
この配列を再帰的に計算するには、k==0 から開始し、前の 2 つの要素を組み合わせて上位の各要素の値を作成します。
BIG[a,k] = max(BIG[a,k-1] , BIG[a+2^(k-1),k-1])
SMALL[a,k] = min(SMALL[a,k-1] , SMALL[a+2^(k-1),k-1])
クエリごとのルックアップ O(1)
次に、事前に準備された 2 つの回答を組み合わせることで、任意の範囲の最大値と最小値を即座に見つけることができます。
100 から 133 までの要素の最大値を見つけたいとします。100 から 131 までの 32 要素の最大値 (BIG[100,5]) と、102 から 133 までの 32 要素の最大値 (BIG[102 内) は既にわかっています。 ,5]) したがって、これらの最大のものを見つけて答えを得ることができます。
同じロジックが最小値にも適用されます。2 つの重複する準備済みの回答をいつでも見つけることができ、それらを組み合わせて必要な回答を得ることができます。