#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int Max=1e5+1;
ifstream fin("sequencequery.in");
ofstream fout("sequencequery.out");
struct node
{
ll suma;
ll pref;
ll suf;
ll smax;
}tree[4*Max];
int v[Max];
int n,m;
node answer(node st, node dr)
{
node ans;
ans.suma=st.suma+dr.suma;
ans.pref=max(st.pref,st.suma+dr.pref);
ans.suf=max(dr.suf,st.suf+dr.suma);
ans.smax=max(st.suf+dr.pref,max(st.smax,dr.smax));
return ans;
}
void build(int nod,int st,int dr)
{
if(st==dr)
{
tree[nod].suma=tree[nod].pref=tree[nod].suf=tree[nod].smax=v[st];
return;
}
int mij=(st+dr)/2;
build(2*nod,st,mij);
build(2*nod+1,mij+1,dr);
tree[nod]=answer(tree[2*nod],tree[2*nod+1]);
}
node query(int nod, int x,int y, int st,int dr)
{
if(st>=x and dr<=y)
{
return tree[nod];
}
int mij=(st+dr)/2;
if(y<=mij)
return query(2*nod,x,y,st,mij);
if(x>=mij+1)
return query(2*nod+1,x,y,mij+1,dr);
node lft=query(2*nod,x,y,st,mij);
node rgt=query(2*nod+1,x,y,mij+1,dr);
return answer(lft,rgt);
}
void read()
{
fin>>n>>m;
for(int i=1;i<=n;i++)
{
fin>>v[i];
}
build(1,1,n);
for(int i=1;i<=m;i++)
{
int a,b;
fin>>a>>b;
fout<<query(1,a,b,1,n).smax<<'\n';
}
}
int main()
{
read();
return 0;
}