#include <bits/stdc++.h>
using namespace std;
const int MAXN = 2e5 + 1;
struct node{
int sum, lc, rc;
};
int root[MAXN];
vector<node> seg;
int create(){
seg.push_back({0, 0, 0});
return (int) seg.size() - 1;
}
int update(int x, int lx, int rx, int i, int val){
int nx = create();
seg[nx] = seg[x];
if(lx == rx){
seg[nx].sum += val;
return nx;
}
int m = (lx + rx) >> 1;
if(i <= m){
seg[nx].lc = update(seg[nx].lc, lx, m, i, val);
} else seg[nx].rc = update(seg[nx].rc, m + 1, rx, i, val);
seg[nx].sum = seg[seg[nx].lc].sum + seg[seg[nx].rc].sum;
return nx;
}
int query(int x1, int x2, int lx, int rx, int val){
int sum = seg[x2].sum - seg[x1].sum;
if(sum <= val) return -1;
if(lx == rx) return lx;
int m = (lx + rx) >> 1;
int bs_r = query(seg[x1].rc, seg[x2].rc, m + 1, rx, val + (m - lx + 1));
if(bs_r != -1) return bs_r;
return query(seg[x1].lc, seg[x2].lc, lx, m, val - (seg[seg[x2].rc].sum - seg[seg[x1].rc].sum));
}
int main(){
cin.tie(0)->sync_with_stdio(0);
int n, q; cin >> n >> q;
create();
create();
int cur = 1;
root[0] = cur;
for(int i=1; i<=n; i++){
int a; cin >> a;
cur = update(cur, 1, MAXN, a, 1);
root[i] = cur;
}
while(q--){
int l, r; cin >> l >> r;
cout << query(root[l - 1], root[r], 1, MAXN, 0) << "\n";
}
return 0;
}