#include<bits/stdc++.h>
using namespace std;
inline int read(){
int ret=0;
char ch=' ',c=getchar();
while(!('0'<=c&&c<='9')) ch=c,c=getchar();
while('0'<=c&&c<='9') ret=(ret<<1)+(ret<<3)+c-'0',c=getchar();
return ch=='-'?-ret:ret;
}
int n,m;
int a[100010];
struct NODE{
int l,r,ma;
};
NODE tr[400010];
void pushup(int u){
tr[u].ma=max(tr[u<<1].ma,tr[u<<1|1].ma);
}
void pushup(NODE &root,NODE &zuo,NODE &you){
root.ma=max(zuo.ma,you.ma);
}
void build(int u,int l,int r){
if(l==r){
tr[u]=(NODE){l,r,a[l]};
return;
}
tr[u]=(NODE){l,r};
int mid=(l+r)/2;
build(u<<1,l,mid);
build(u<<1|1,mid+1,r);
pushup(u);
}
NODE query(int u,int l,int r){
if(tr[u].l>=l&&tr[u].r<=r) return tr[u];
NODE ans;
int mid=(tr[u].l+tr[u].r)/2;
if(mid<l) ans=query(u<<1|1,l,r);
else if(mid>=r) ans=query(u<<1,l,r);
else{
NODE zuo=query(u<<1,l,r);
NODE you=query(u<<1|1,l,r);
pushup(ans,zuo,you);
}
return ans;
}
int main(){
n=read();
m=read();
for(int i=1;i<=n;i++) a[i]=read();
build(1,1,n);
while(m--){
int x,y;
x=read();
y=read();
printf("%d\n",query(1,x,y).ma);
}
return 0;
}