#include <bits/stdc++.h>
using namespace std;
ifstream f("sequencequery.in");
ofstream g("sequencequery.out");
int n,q,p,x,y;
long long ans,S;
struct node{
long long left,right,best,sum;
}v[1<<20];
inline void update(int nod, int st, int dr, int poz, long long x)
{
if(st==dr)
{
v[nod].left=v[nod].right=v[nod].best=v[nod].sum=x;
return;
}
int mid=(st+dr)>>1;
if(poz<=mid)
update(2*nod, st, mid, poz, x);
else
update(2*nod+1, mid+1, dr, poz, x);
v[nod].left=max(v[2*nod].left, v[2*nod].sum+v[2*nod+1].left);
v[nod].right=max(v[2*nod+1].right, v[2*nod+1].sum+v[2*nod].right);
v[nod].best=max(v[2*nod].right+v[2*nod+1].left, max(v[2*nod].best, v[2*nod+1].best));
v[nod].sum=v[2*nod].sum+v[2*nod+1].sum;
}
inline void query(int nod,int st, int dr, int a, int b)
{
if(st>=a && dr<=b)
{
if(a==b)
{
ans=v[nod].best;
return;
}
ans=max(ans, max(S+v[nod].left, v[nod].best));
S=max(S+v[nod].sum, v[nod].right);
return;
}
int mid=(st+dr)>>1;
if(a<=mid)
query(2*nod, st, mid, a, min(b, mid));
if(b>mid)
query(2*nod+1, mid+1, dr, max(a, mid+1), b);
}
int main()
{
f>>n>>q;
for(int i=1;i<=n;++i)
{
f>>x;
update(1, 1, n, i, x);
}
for(int i=1;i<=q;++i)
{
f>>x>>y;
ans=INT_MIN;
S=0;
query(1, 1, n, x, y);
g<<ans<<'\n';
}
return 0;
}