#include<iostream>
#include<cmath>
using namespace std;
int f[100010][30];//i,i+2^j-1
int n,m;
int logg[100010];
inline int read()
{
int x=0,f=1;char ch=getchar();
while (ch<'0'||ch>'9'){if (ch=='-') f=-1;ch=getchar();}
while (ch>='0'&&ch<='9'){x=x*10+ch-48;ch=getchar();}
return x*f;
}
void stBuild(){
for(int i=2;i<=n;i++)
logg[i]=logg[i/2]+1;
int k=logg[n];
for(int j=1;j<=k;j++)
for(int i=1;i+(1<<j )-1 <=n;i++){
f[i][j]=max(f[i][j-1],f[i+(1<<(j-1))][j-1]);
}
}
int stQuery(int l,int r){
int k=logg[r-l+1];
return max(f[l][k],f[r-(1<<k)+1][k]);
}
int main(){
n=read();
m=read();
for(int i=1;i<=n;i++){
f[i][0]=read();
}
stBuild();
int l,r;
while(m--){
l=read();
r=read();
printf("%d\n",stQuery(l,r));
}
}
ST表解决区间最值问题
最新推荐文章于 2024-06-07 19:44:58 发布