1 /* basic header */
2 #include <iostream>
3 #include <cstring>
4 /* define */
5 #define ll long long
6 #define dou double
7 #define pb emplace_back
8 #define mp make_pair
9 #define sot(a,a+1+b)
10 #define rep1(i,b) for(int i=a;i<=b;++i)
11 #define rep0(i,b) for(int i=a;i<b;++i)
12 #define eps 1e-8
13 #define int_inf 0x3f3f3f3f
14 #define ll_inf 0x7f7f7f7f7f7f7f7f
15 #define lson (curpos<<1)
16 #define rson (curpos<<1|1)
17 /* namespace */
18 using namespace std;
19 /* header end */
20
21 const int maxn = 1e5 + 10;
22 int a[maxn];
23
24 struct Node {
25 int l,r,val[50];
26 };
27
28 Node segt[maxn << 2];
29
30 void maintain(Node &fa,Node &ls,Node &rs) {
31 int i = 0,j = 0;
32 rep0(c,0,50) {
33 if (i >= 50)
34 fa.val[c] = rs.val[j++];
35 else if (j >= 50)
36 fa.val[c] = ls.val[i++];
37 else if (ls.val[i] < rs.val[j])
38 fa.val[c] = rs.val[j++];
39 else fa.val[c] = ls.val[i++];
40 }
41 }
42
43 void build(int curpos,int curl,int curr) {
44 segt[curpos].l = curl,segt[curpos].r = curr;
45 // memset(segt[curpos].val,sizeof(segt[curpos].val));
46 if (curl < curr) { // if is not leaf node
47 int mid = curl + curr >> 1;
48 build(lson,curl,mid); build(rson,mid + 1,curr);
49 maintain(segt[curpos],segt[lson],segt[rson]);
50 } else
51 segt[curpos].val[0] = a[curl]; // if is leaf node
52 }
53
54 Node query(int curpos,int curr) {
55 if (segt[curpos].l == curl && segt[curpos].r == curr) return segt[curpos];
56 else {
57 int mid = segt[curpos].l + segt[curpos].r >> 1;
58 if (curr <= mid) return query(lson,curr);
59 else if (curl > mid) return query(rson,curr);
60 else {
61 Node lnode = query(lson,mid),rnode = query(rson,curr);
62 Node ret; ret.l = curl,ret.r = curr;
63 maintain(ret,lnode,rnode);
64 return ret;
65 }
66 }
67 }
68
69 int main() {
70 int n,q;
71 while (~scanf("%d%d",&n,&q)) {
72 rep1(i,1,n) scanf("%d",&a[i]);
73 build(1,1,n);
74 while (q--) {
75 int l,r; scanf("%d%d",&l,&r);
76 Node cur = query(1,l,r);
77 ll ans = -1;
78 rep0(i,48) {
79 if ((ll)cur.val[i] < (ll)cur.val[i + 1] + (ll)cur.val[i + 2]) {
80 ans = (ll)cur.val[i] + (ll)cur.val[i + 1] + (ll)cur.val[i + 2];
81 break;
82 }
83 }
84 printf("%lld\n",ans);
85 }
86 }
87 return 0;
88 }