#include <bits/stdc++.h>
using namespace std;
long long nrt,i,st,dr,n,m;
long long ras,s;
struct arbore
{
long long ssm, sum, prefix, sufix;
}aint[800000];
void update (long long nod, long long st, long long dr, long long poz, long long val)
{
long long mij;
if(st==dr)
{
aint[nod].ssm=val;
aint[nod].sum=val;
aint[nod].prefix=val;
aint[nod].sufix=val;
return ;
}
mij=(st+dr)/2;
if(poz<=mij) update (nod*2, st, mij, poz, val);
else update(nod*2+1, mij+1, dr, poz, val);
///subsecventa de suma maxima
aint[nod].ssm=max(aint[nod*2].sufix+aint[nod*2+1].prefix, max(aint[nod*2].ssm, aint[nod*2+1].ssm));
///suma totala
aint[nod].sum=aint[nod*2].sum+aint[nod*2+1].sum;
///cel mai mare prefix
aint[nod].prefix=max(aint[nod*2].prefix, aint[nod*2].sum+aint[nod*2+1].prefix);
///cel mai mare sufix
aint[nod].sufix=max (aint[nod*2+1].sufix, aint[nod*2+1].sum+aint[nod*2].sufix);
}
void query (long long nod, long long st, long long dr, long long x, long long y)
{
long long mij;
if (x<=st&&dr<=y)
{
if(s<0)s=0;
if (ras<max(s+aint[nod].prefix, aint[nod].ssm))ras=max(s+aint[nod].prefix, aint[nod].ssm);
s=max(s+aint[nod].sum, aint[nod].sufix);
return;
}
mij = (st+dr)/2;
if(x<=mij)query(2*nod, st, mij, x, y);
if(y>=mij+1)query(2*nod+1, mij+1, dr, x, y);
}
int main()
{
freopen("sequencequery.in","r",stdin);
freopen("sequencequery.out","w",stdout);
scanf("%lld",&n);
scanf("%lld",&m);
for(i=1;i<=n;i++)
{
scanf("%lld",&nrt);
update(1,1,n,i,nrt);
}
for(i=1;i<=m;i++)
{
scanf("%lld%lld",&st,&dr);
/*if(nrt==0)
{
st++;
update(1,1,n,st,dr);
}
else
{
st++;
dr++;*/
ras=s=0;
ras=-2000000;
query(1,1,n,st,dr);
//if(ras<0)ras=0;
printf("%lld\n",ras);
//}
}
return 0;
}