#include <bits/stdc++.h>
#define inf 2000000000
using namespace std;
ifstream f("sequencequery.in");
ofstream g("sequencequery.out");
struct interval
{
int stn,drt;
long long sumstn, sumdrt, summij, sumtot;
};
interval arb[800001];
int n,x,q,a[200001],b[200001];
long long sol,aux;
void update(int po, int st, int dr)
{
if(st==dr)
{
arb[po].stn=st;
arb[po].drt=dr;
arb[po].sumstn=a[st];
arb[po].sumdrt=a[st];
arb[po].summij=a[st];
arb[po].sumtot=a[st];
return ;
}
arb[po].stn=st;
arb[po].drt=dr;
int mij=(st+dr)/2;
update(2*po,st,mij);
update(2*po+1,mij+1,dr);
arb[po].sumtot=arb[2*po].sumtot+arb[2*po+1].sumtot;
arb[po].sumstn=max(arb[2*po].sumstn,arb[2*po].sumtot+arb[2*po+1].sumstn);
arb[po].sumdrt=max(arb[2*po+1].sumdrt,arb[2*po].sumdrt+arb[2*po+1].sumtot);
arb[po].summij=max(max(arb[2*po].summij,arb[2*po+1].summij),arb[2*po].sumdrt+arb[2*po+1].sumstn);
}
void interogare(int po, int st, int dr, int a, int b)
{
if(a<=st&&dr<=b)
{
sol=max(sol,max(arb[po].summij,aux+arb[po].sumstn));
aux=max(aux+arb[po].sumstn, arb[po].sumdrt);
return;
}
int mij=(st+dr)/2;
if(a<=mij) interogare(2*po,st,mij,a,b);
if(b>mij) interogare(2*po+1,mij+1,dr,a,b);
}
int main()
{
f>>n>>q;
for(int i=1;i<=n;i++)
{
f>>a[i];
}
update(1,1,n);
int k=1;
while(arb[k].drt)
{
g<<arb[k].stn<<" "<<arb[k].drt<<" "<<arb[k].sumstn<<" "<<arb[k].sumdrt<<" "<<arb[k].summij<<" "<<arb[k].sumtot<<'\n';
k++;
}
for(int i=1;i<=q;i++)
{
char c;
int x,y;
f>>x>>y;
///if(c=='1')
//{
sol=aux=-inf;
///x++; y++;
interogare(1,1,n,x,y);
g<<sol<<'\n';
//}
///x++; update(1,1,n);
}
return 0;
}