#include <iostream>
#include <algorithm>
#include <string>
#include <cstring>
#include <cmath>
#include <set>
#include <map>
using namespace std;
#define ll long long
#define INF 0x7FFFFFFF
const int N = 1e5+10;
const int M = N*4;
const double eps = 1e-8;
ll a[N];
struct Tree {
ll l, r;
ll val;
}t[M];
ll lc(ll k) {
return k << 1;
}
ll rc(ll k) {
return k << 1 | 1;
}
inline void push_up(ll k) {
t[k].val = max(t[lc(k)].val, t[rc(k)].val);
}
inline void buildTree(ll k, ll l, ll r) {
t[k].l = l, t[k].r = r;
if(l == r) {
t[k].val = a[l];
return;
}
ll mid = (l + r) >> 1;
buildTree(lc(k), l, mid);
buildTree(rc(k),mid+1, r);
push_up(k);
}
ll query(ll k, ll l, ll r) {
if(t[k].l >= l && t[k].r <= r) {
return t[k].val;
}
ll mid = (t[k].l + t[k].r) >> 1;
ll res = -INF;
if(l <= mid)
res = max(res, query(lc(k), l, r));
if(r > mid)
res = max(res, query(rc(k), l, r));
return res;
}
int main() {
int n, m;
scanf("%d%d",&n,&m);
for(int i = 1; i <= n; ++i) {
scanf("%lld", &a[i]);
}
buildTree(1,1,n);
while(m--) {
ll l, r;
scanf("%lld%lld",&l,&r);
printf("%lld\n", query(1,l,r));
}
return 0;
}