#include<algorithm>
#include<iostream>
#include<cstdlib>
#include<cstring>
#include<cstdio>
#include<vector>
#include<queue>
#include<cmath>
#include<map>
#include<set>
#define LL long long int
#define REP(i,n) for (int i = 1; i <= (n); i++)
#define Redge(u) for (int k = h[u],to; k; k = ed[k].nxt)
#define cls(s,v) memset(s,v,sizeof(s))
#define mp(a,b) make_pair<int,int>(a,b)
#define cp pair<int,int>
using namespace std;
const int maxn = 100005,maxm = 10000005,INF = 0x3f3f3f3f;
inline int read(){
int out = 0,flag = 1; char c = getchar();
while (c < 48 || c > 57){if (c == '-') flag = 0; c = getchar();}
while (c >= 48 && c <= 57){out = (out << 1) + (out << 3) + c - 48; c = getchar();}
return flag ? out : -out;
}
int rt[maxn],sum[maxm],ls[maxm],rs[maxm],pos,siz,n,Q;
LL a[maxn],b[maxn],tot;
void add(int& u,int v,int l,int r){
u = ++siz; ls[u] = ls[v]; rs[u] = rs[v]; sum[u] = sum[v];
if (l == r){sum[u]++;return;}
int mid = (l + r) >> 1;
if (mid >= pos) add(ls[u],ls[v],l,mid);
else add(rs[u],rs[v],mid + 1,r);
sum[u] = sum[ls[u]] + sum[rs[u]];
}
LL ans,L,R;
int kth(int u,int v,int l,int r,int k){
if (l == r) return l;
int mid = (l + r) >> 1;
if (sum[rs[u]] - sum[rs[v]] >= k) return kth(rs[u],rs[v],mid + 1,r,k);
return kth(ls[u],ls[v],l,mid,k - sum[rs[u]] + sum[rs[v]]);
}
void work(){
while (Q--){
L = read() - 1; R = read(); ans = -1;
LL K = 1,t,tt,ttt;
while (K + 2 <= R - L){
t = b[kth(rt[R],rt[L],1,tot,K)];
tt = b[kth(rt[R],rt[L],1,tot,K + 1)];
ttt = b[kth(rt[R],rt[L],1,tot,K + 2)];
if (t < tt + ttt) {ans = t + tt + ttt; break;}
K++;
}
printf("%lld\n",ans);
}
}
int main(){
while (scanf("%d%d",&n,&Q)==2){
siz = 0;
REP(i,n) b[i] = a[i] = read();
sort(b + 1,b + 1 + n); tot = 1;
for (int i = 2; i <= n; i++) if (b[i] != b[tot]) b[++tot] = b[i];
REP(i,n) a[i] = lower_bound(b + 1,b + 1 + tot,a[i]) - b;
REP(i,n) pos = a[i],add(rt[i],rt[i - 1],1,tot);
work();
}
return 0;
}