//ineficient
#include <cstdio>
#include <algorithm>
#define maxN 400005
#define INF 100000000000LL
using namespace std;
int n, m, i;
long long s1[maxN], s2[maxN], v[maxN], s[maxN], arb[maxN], maxx, sum, j, val, poz, start, stop;
void update(int nod, int st, int dr)
{
if(st == dr)
{
arb[nod] = s[nod] = s1[nod] = s2[nod] = val;
return;
}
int mij = (st+dr)/2;
if(poz <= mij) update((nod<<1), st, mij);
else update((nod<<1)+1, mij+1, dr);
arb[nod] = arb[(nod<<1)] + arb[(nod<<1)+1];
s1[nod] = max(s1[(nod<<1)], arb[(nod<<1)] + s1[(nod<<1)+1]);
s2[nod] = max(s2[(nod<<1)+1], arb[(nod<<1)+1] + s2[(nod<<1)]);
s[nod] = max(s[(nod<<1)], s[(nod<<1)+1]);
s[nod] = max(s[nod], s2[(nod<<1)] + s1[(nod<<1)+1]);
}
void query(int nod, int st, int dr)
{
int mij = (st+dr)/2;
if(st >= start && dr <= stop)
{
maxx = max(maxx, max(s[nod], sum+s1[nod]));
sum = max(sum+arb[nod], s2[nod]);
return;
}
if(start <= mij) query((nod<<1), st, mij);
if(mij+1 <= stop) query((nod<<1)+1, mij+1, dr);
}
int main()
{
freopen("sequencequery.in", "r", stdin);
freopen("sequencequery.out", "w", stdout);
scanf("%d %d", &n, &m);
for(i = 1; i <= n; i++)
{
scanf("%lld", &v[i]);
val = v[i], poz = i;
update(1, 1, n);
}
while(m--)
{
scanf("%lld %lld", &start, &stop);
maxx = -INF;
sum = 0;
query(1, 1, n);
printf("%lld\n", maxx);
}
return 0;
}