rt,
#include<bits/stdc++.h>
using namespace std;
const int MN=2*1e6+1;
int f[MN][20];
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;
}
int pw[21];
inline void cpw(){
pw[0]=1;
for(int i=1;i<=20;i++)
{
pw[i]=pw[i-1]*2;
}
return ;
}
int lg[MN];
inline void clg(){
lg[1]=0;
for(int i=2;i<=MN;i++)
{
lg[i]=pw[(int)log2(i)];
}
return ;
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(nullptr);
cpw();
clg();
int n=read(),m=read();
int a[n+1];
for(int i=1;i<=n;i++)
{
a[i]=read();
f[i][0]=a[i];
}
for(int j=1;j<=20;j++)
{
for(int i=1;i<=n;i++)
{
if(i+pw[j]-1<=n)
{
f[i][j]=max(f[i][j-1],f[i+pw[j-1]][j-1]);
}
}
}
for(int i=1,x,y;i<=m;i++)
{
x=read();
y=read();
int t=lg[y-x];
int p1=f[x][t];
int p2=f[y-pw[t]+1][t];
cout<<max(p1,p2)<<endl;
}
return 0;
}
样例没过,求改(应该是状态转移方程的问题)