#include <iostream>
#include <fstream>
using namespace std;
ifstream f("sequencequery.in");
ofstream g("sequencequery.out");
struct gogu
{
long long stmax,drmax,smax,sum;
}arb[4*100010+55],sol;
int i,j,n,m,start,finish,pos,x,ok;
void update(int nod,int st,int dr)
{
int mij;
if(st==dr)
{
f>>arb[nod].smax;
arb[nod].sum=arb[nod].smax;
arb[nod].stmax=arb[nod].smax;
arb[nod].drmax=arb[nod].smax;
}
else
{
mij=(st+dr)/2;
update(2*nod,st,mij);
update(2*nod+1,mij+1,dr);
arb[nod].sum=arb[2*nod].sum+arb[2*nod+1].sum;
arb[nod].smax=max(arb[2*nod].smax,max(arb[2*nod+1].smax,arb[2*nod].drmax+arb[2*nod+1].stmax));
arb[nod].stmax=max(arb[2*nod].stmax,arb[2*nod+1].stmax+arb[2*nod].sum);
arb[nod].drmax=max(arb[2*nod+1].drmax,arb[2*nod].drmax+arb[2*nod+1].sum);
}
}
void query(int nod,int st,int dr,int start,int finish)
{
int mij;
if(start<=st && dr<=finish)
{
if(ok==0)
{
sol=arb[nod];
ok=1;
}
else
{
sol.smax=max(sol.smax,max(arb[nod].smax,sol.drmax+arb[nod].stmax));
sol.sum+=arb[nod].sum;
sol.stmax=max(arb[nod].stmax,arb[nod].sum+sol.stmax);
sol.drmax=max(arb[nod].drmax,arb[nod].sum+sol.drmax);
}
}
else
{
mij=(st+dr)/2;
if(start<=mij)
query(2*nod,st,mij,start,finish);
if(mij<finish)
query(2*nod+1,mij+1,dr,start,finish);
}
}
int main()
{
f>>n>>m;
update(1,1,n);
for(i=1;i<=m;i++)
{
f>>start>>finish;
ok=0;
query(1,1,n,start,finish);
g<<sol.smax<<"\n";
}
}