#include <fstream>
using namespace std;
ifstream f ("sequencequery.in");
ofstream g ("sequencequery.out");
const long long nmax=1e5+3;
long long arb1[4*nmax],arb2[4*nmax],val,poz,a,b,usu1,usu2,n,m,v[nmax],sol,vv[nmax];
void update1(long long st,long long dr,long long nod)
{
if(st==dr)
{
arb1[nod]=val;
return;
}
long long mij=(st+dr)/2;
if(poz<=mij) update1(st,mij,2*nod);
else update1(mij+1,dr,2*nod+1);
arb1[nod]=min(arb1[2*nod],arb1[2*nod+1]);
}
void update2(long long st,long long dr,long long nod)
{
if(st==dr)
{
arb2[nod]=val;
return;
}
long long mij=(st+dr)/2;
if(poz<=mij) update2(st,mij,2*nod);
else update2(mij+1,dr,2*nod+1);
arb2[nod]=max(arb2[2*nod],arb2[2*nod+1]);
}
void query1(long long st,long long dr,long long nod)
{
if(a<=st&&dr<=b)
{
usu1=min(usu1,arb1[nod]);
return;
}
long long mij=(st+dr)/2;
if(a<=mij) query1(st,mij,2*nod);
if(b>mij) query1(mij+1,dr,2*nod+1);
}
void query2(long long st,long long dr,long long nod)
{
if(a<=st&&dr<=b)
{
usu2=max(usu2,arb2[nod]);
return;
}
long long mij=(st+dr)/2;
if(a<=mij) query2(st,mij,2*nod);
if(b>mij) query2(mij+1,dr,2*nod+1);
}
int main()
{
f>>n>>m;
for(long long i=1;i<=4*n;++i)
{
arb1[i]=2e9;
arb2[i]=-2e9;
}
for(long long i=1;i<=n;++i)
{
f>>vv[i];
v[i]=vv[i]+v[i-1];
poz=i;
val=v[i];
update1(1,n,1);
update2(1,n,1);
}
while(m--)
{
f>>a>>b;
if(a==b)
{
g<<vv[a]<<'\n';
continue;
}
usu1=2e9;
query1(1,n,1);
usu2=-2e9;
query2(1,n,1);
if(usu1>0) usu1=min(v[a-1],usu1);
sol=usu2-usu1;
//g<<usu1<<' '<<usu2<<'\n';
g<<sol<<'\n';
}
return 0;
}