#include <bits/stdc++.h>
#define mp make_pair
#define pb push_back
#define pf push_front
#define ll long long
#define ull unsigned long long
#define x first
#define y second
#define pi pair<int,int>
#define pl pair<ll,ll>
#define EPSILON 0.000001
#define zeros(x) ((x^(x-1))&x)
using namespace std;
ifstream fin("sequencequery.in.in");
ofstream fout("sequencequery.in.out");
const ll NMAX=1e5+5,INF=1e18,MOD=9917,MMAX=1e2+5,inf=INT_MAX;
int N,M;
int v[NMAX];
struct node
{
int sum,pref,suf,res;
};
node aint[4*NMAX],NO;
node uneste(node a,node b)
{
node c;
c.sum=a.sum+b.sum;
c.pref=max(a.pref,a.sum+b.pref);
c.suf=max(b.suf,a.suf+b.sum);
c.res=max(a.res,max(b.res,a.suf+b.pref));
return c;
}
void build(int nod,int left,int right)
{
if(left>right)return;
if(left==right)
{
aint[nod].sum=v[left];
aint[nod].pref=v[left];
aint[nod].suf=v[left];
aint[nod].res=v[left];
return;
}
int mid=(left+right)/2;
build(2*nod,left,mid);
build(2*nod+1,mid+1,right);
aint[nod]=uneste(aint[2*nod],aint[2*nod+1]);
}
node query(int nod,int left,int right,int st,int dr)
{
if(left>dr||right<st)return NO;
if(st<=left&&right<=dr)
{
return aint[nod];
}
int mid=(left+right)/2;
return uneste(query(2*nod,left,mid,st,dr),query(2*nod+1,mid+1,right,st,dr));
}
int main()
{
fin>>N>>M;
for(int i=1;i<=N;i++)
{
fin>>v[i];
}
NO.res=NO.sum=NO.pref=NO.suf=-1e9;
build(1,1,N);
for(int i=1;i<=M;i++)
{
int a,b;
fin>>a>>b;
fout<<query(1,1,N,a,b).res<<'\n';
}
return 0;
}