#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<cmath>
#include<climits>
using namespace std;
const int N = 1e5+10;
int n,m ;
int w[N] ;
struct Node
{
int l, r;
int maxv;
}tr[N*4];
void as()
{
exit(0);
}
void build(int u , int l , int r)
{
if(l == r) tr[u] = { l , r , w[l]};
else
{
tr[u] = {l,r};
int mid = (tr[u].l + tr[u].r)/2;
build(u*2, l,mid),build(u*2 + 1 , mid +1 ,r);
tr[u].maxv = max(tr[u*2].maxv,tr[u*2+1].maxv);
}
}
int query(int u , int l, int r )
{
if(tr[u].l >=l &&tr[u].r<=r) return tr[u].maxv;
int mid = (tr[u].l + tr[u].r)/2;
int ans = INT_MIN;
if( l <= mid) ans = query(u*2 , l, r);
//as();
if( r > mid) ans = max(ans, query(u*2+1 , l, r)); //必须是 > 没有=
return ans;
}
int main()
{
scanf("%d%d" , &n,&m);
for(int i = 1 ; i <= n ; i++) scanf("%d" ,&w[i]); // for(int i = 0 ; i < n ; i++) scanf("%d" ,&w[i]);
//下标要从1 开始
build(1,1,n);
int x,y ;
while(m--)
{
//cin>>x>>y;
scanf("%d%d" , &x,&y);
printf("%d\n",query(1,x,y));
}
return 0 ;
}