感觉还是线段树比较清楚一点,
当然RMQ也挺方便的。对于查询次数特别多的处理比较优秀。
#include <iostream>
#include <stdio.h>
#include <math.h>
using namespace std;
#define LL long long
const int N = 1e6;
int a[N];//数组1开始
int n;
int mx[N][30];
void RMQpre()
{
int temp=(int)log2((double)n);
for(int i=1;i<=n;i++)
{
mx[i][0]=a[i];
}
for(int j=1;j<=temp;j++)
{
for(int i=1;i+(1<<j)-1<=n;i++)
{
mx[i][j]=max(mx[i][j-1],mx[i+(1<<j-1)][j-1]);
}
}
}
int query(int l,int r)
{
int k=(int)log2((double)r-l+1);
return max(mx[l][k],mx[r+1-(1<<k)][k]);
}
int main()
{
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>a[i];
}
RMQpre();
int l,r;
while(cin>>l>>r)
printf("%d\n",query(l,r));
}