具体算法分析可以看博客点击打开链接
附上模板
#include<iostream>
#include<cmath>
#define maxn 10010
using namespace std;
int n;
int m;
int a,b;
int Min[maxn][10010];
int Max[maxn][10010];
int arr[maxn];
void RMQ()
{
for(int i=1;i<=n;i++)
Min[i][0]=Max[i][0]=arr[i];
for(int i=1;(1<<i)<=n;i++)
{
for(int j=1;j+(1<<i)-1<=n;j++)
{
Min[j][i]=min(Min[j][i-1],Min[j+(1<<(i-1))][i-1]);
Max[j][i]=max(Max[j][i-1],Max[j+(1<<(i-1))][i-1]);
}
}
}
int Query(int l,int r)
{
int k=(int)(log((double)(r-l+1))/(log((double)2)));
return max(Max[l][k],Max[r-(1<<k)+1][k]);
}
int main()
{
while(cin>>n>>m)
{
for(int i=1;i<=n;i++)
cin>>arr[i];
RMQ();
while(m--)
{
cin>>a>>b;
cout<<"查询结果为:"<<endl;
cout<<Query(a,b)<<endl;
}
}
}