Вы можете сделать это за O (n) время с O (n) пробелом.
Разделить массив на блоки каждого.
[a1 a2 ... ak] [a(k+1) ... a2k] ...
Для каждого блока сохраните еще два блока, левый блок и правый блок.
i-й элемент левого блока будет максимальным из элементов i слева.
Элемент ith правого блока будет максимальным из элементов i справа.
У вас будет два таких блока для каждого блока k.
Теперь, если вы хотите найти максимум в диапазоне a[i... i+k]
, скажем, элементы охватывают два из указанных выше блоков k.
[j-k+1 ... i i+1 ... j] [j+1 ... i+k ... j+k]
Все, что вам нужно сделать, это найти максимум RightMax, равный i to j
первого блока, и левый максимум, равный j+1 to i+k
второго блока.