#include <bits/stdc++.h>
#define ll long long
using namespace std;
ifstream fin("sequencequery.in");
ofstream fout("sequencequery.out");
ll mx(ll a,ll b)
{
if(a>b)return a;
return b;
}
struct node
{
ll sum,pref,suff,ans;
};
ll v[200001];
node A[500001];
node combine(node l,node r)
{
node res;
res.sum=l.sum+r.sum;
res.pref=mx(l.pref, l.sum+r.pref);
res.suff=mx(r.suff, r.sum+l.suff);
res.ans=mx(mx(l.ans, r.ans), l.suff+r.pref);
return res;
}
void build(int i,int st,int dr)
{
if(st==dr)
{
A[i]={v[st],v[st],v[st],v[st]};
}
else
{
int m = (st+dr)/2;
build(2*i,st,m);
build(2*i+1,m+1,dr);
A[i]=combine(A[2*i],A[2*i+1]);
}
}
node query(int i,int st,int dr,int a,int b)
{
if(a<=st && dr<=b)
{
return A[i];
}
else
{
int m = (st+dr)/2;
node left,right;
if(a <= m)
{
left=query(2*i,st,m,a,b);
}
if(b>m)
{
right=query(2*i+1,m+1,dr,a,b);
}
if(a<=m && b > m)
{
return combine(left,right);
}
return a<=m ? left : right;
}
}
int main()
{
int n,q;
fin >> n >> q;
for(int i=1;i<=n;i++)
{
fin >> v[i];
}
build(1,1,n);
while(q--)
{
int t,a,b;
fin >> a >> b;
fout << query(1,1,n,a,b).ans << "\n";
}
}