#include<cmath>
#include<cstdio>
#include<iostream>
#include<algorithm>
using namespace std;
const int maxn = 1e5+6;
int n,m,a[maxn],f[maxn][21];
void RMQ(int n)
{
for(int j=1;j<=20;j++)
for(int i=1;i<=n && i+(1<<j-1)<=n;i++)
f[i][j] = max(f[i][j-1],f[i+(1<<(j-1))][j-1]);
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)
{
scanf("%d",&a[i]);
f[i][0] = a[i];
}
RMQ(n);
for(int i=1;i<=m;i++)
{
int L,R;
scanf("%d%d",&L,&R);
int k = (int)(log((double)(R - L + 1)) / log(2.0));// 保证 可以覆盖到i - j全部 数值 2^(
printf("%d\n",max(f[L][k],f[R - (1 << k) + 1][k]));
}
return 0;
}
原文:https://www.cnblogs.com/-Wind-/p/11857581.html