https://www.luogu.org/problemnew/show/P3865
#include<stdio.h>
#include<iostream>
#include<iomanip>
#include<cstring>
#include<string>
#include<math.h>
#include<algorithm>
using namespace std;
int n, m;
int a[100005];
int ST[100005][17];
void init()
{
for(int i = 1; i <= n; i++)
ST[i][0] = a[i];
int loop = log(n * 1.0) / log(2 * 1.0);
for(int i = 1; i <= loop; i++)//分长度
for(int j = 1; j <= (n + 1 - (1<<i)); j++)//从每个起点开始
ST[j][i] = max(ST[j][i - 1], ST[j + (1<<(i-1))][i-1]);
}
int main()
{
scanf("%d%d", &n, &m);
for(int i = 1; i <= n; i++)
scanf("%d", &a[i]);
init();
int left , right;
while(m--)
{
scanf("%d%d", &left, &right);
int len = right - left + 1;
int p = log(len*1.0) / log(2*1.0);
int res = max(ST[left][p], ST[right - (1<<p) + 1][p]);//从后往前取2的p次方个
//从left往前取2的p次方个,重叠不影响取最值
printf("%d\n", res);
}
//system("pause");
}