RT,
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
namespace INPUT{
char buf[1<<20],*p1,*p2;
#define gc() (p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<20,stdin),p1==p2)?EOF:*p1++)
}
using namespace INPUT;
template<typename T>
inline T read(){
T x=0,p=1;
char ch=gc();
while(ch<'0'||ch>'9'){
if(ch=='-') p=-1;
ch=gc();
}
while(ch>='0'&&ch<='9'){
x=(x<<3)+(x<<1)+(ch^48);
ch=gc();
}
return x*p;
}
const int N=5e4+5;
class SparseTable{
int f[N][30];
int Log2[N];
public:
Sparse(int _n,int *A){
Log2[1]=0;
for(int i=2;i<=_n;i++) Log2[i]=Log2[i/2]+1;
for(int i=1;i<=_n;i++) f[i][0]=A[i];
int Logn=Log2[_n]+1;
for(int j=1;j<=Logn;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]);
return ;
}
inline int query(int l,int r){
int s=Log2[r-l+1];
return max(f[l][s],f[r-(1<<s)+1][s]);
}
};
void test(int _n,int *A){
return ;
}
int n,Q;
int A[N];
int main(){
freopen("data.in","r",stdin);
n=read<int>(),Q=read<int>();
for(int i=1;i<=n;i++) A[i]=read<int>();
SparseTable st(n,A);
while(Q--){
int l=read<int>(),r=read<int>();
printf("%d\n",st.query(l,r));
}
}