#include<bits/stdc++.h>
#define ll int
#define Mid ll mid = (l + r) >> 1
using namespace std;
const int N = 5e5 + 10, M = N * 21;
ll n, m, a[M], tot = 0;
ll rt[M];
struct node{
ll lc[M], rc[M], val[M];
inline void build(ll &p, ll l, ll r) {
p = ++tot;
val[p] = 0;
if(l == r) return;
Mid;
build(lc[p], l, mid);
build(rc[p], mid+1, r);
}
inline void add(ll pre, ll &p, ll l, ll r, ll k) {
p = ++tot;
val[p] = val[pre]+1, lc[p] = lc[pre], rc[p] = rc[pre];
if(l == r) return;
Mid;
if(k <= mid) add(lc[pre], lc[p], l, mid, k);
if(k > mid) add(rc[pre], rc[p], mid+1, r, k);
}
inline ll query(ll pre, ll p, ll l, ll r, ll k) {
if(l == r) return l;
Mid;
ll res1 = 0, res2 = 0;
if((val[lc[p]] - val[lc[pre]]) * 2 > k) res1 = query(lc[pre], lc[p], l, mid, k);
if((val[rc[p]] - val[rc[pre]]) * 2 > k) res2 = query(rc[pre], rc[p], mid+1, r, k);
if(res1 != 0 && res1 != -1) return res1;
if(res2 != 0 && res2 != -1) return res2;
return -1;
}
}T;
int main (){
scanf("%d%d", &n, &m);
T.build(rt[0], 1, n);
for(int i = 1; i <= n; i++) {
ll x;
scanf("%d", &x);
T.add(rt[i-1], rt[i], 1, n, x);
}
for(int i = 1; i <= m; i++) {
ll l, r;
scanf("%d%d", &l, &r);
ll res = T.query(rt[l-1], rt[r], 1, n, r-l+1);
cout << (res == -1 ? 0 : res) << endl;
}
return 0;
}