# pragma GCC optimize("O3")
# include <bits/stdc++.h>
# define maxn 100001
# define ll long long
# define clock (clock() * 1000.0 / CLOCKS_PER_SEC)
# define rc(s) return cout << s,0
# define _ ios_base::sync_with_stdio(false);cin.tie(0);cerr.tie(0);cout.tie(0);
# define pb push_back
# define mp make_pair
//# define int ll
using namespace std;
const int inf = INT_MAX;
inline int readChar();
template <class T = int> inline T readInt();
template <class T> inline void writeInt( T x, char end = 0 );
inline void writeChar( int x );
inline void writeWord( const char *s );
/** Read */
static const int buf_size = 4096;
inline int getChar() {
static char buf[buf_size];
static int len = 0, pos = 0;
if (pos == len)
pos = 0, len = fread(buf, 1, buf_size, stdin);
if (pos == len)
return -1;
return buf[pos++];
}
inline int readChar() {
int c = getChar();
while (c <= 32)
c = getChar();
return c;
}
template <class T>
inline T readInt() {
int s = 1, c = readChar();
T x = 0;
if (c == '-')
s = -1, c = getChar();
while ('0' <= c && c <= '9')
x = x * 10 + c - '0', c = getChar();
return s == 1 ? x : -x;
}
inline ll readLong() {
int s = 1, c = readChar();
ll x = 0;
if (c == '-')
s = -1, c = getChar();
while ('0' <= c && c <= '9')
x = x * 10 + c - '0', c = getChar();
return s == 1 ? x : -x;
}
/** Write */
static int write_pos = 0;
static char write_buf[buf_size];
inline void writeChar( int x ) {
if (write_pos == buf_size)
fwrite(write_buf, 1, buf_size, stdout), write_pos = 0;
write_buf[write_pos++] = x;
}
template <class T>
inline void writeInt( T x, char end ) {
if (x < 0)
writeChar('-'), x = -x;
char s[24];
int n = 0;
while (x || !n)
s[n++] = '0' + x % 10, x /= 10;
while (n--)
writeChar(s[n]);
if (end)
writeChar(end);
}
inline void writeWord( const char *s ) {
while (*s)
writeChar(*s++);
}
struct Flusher {
~Flusher() {
if (write_pos)
fwrite(write_buf, 1, write_pos, stdout), write_pos = 0;
}
} flusher;
int a[maxn];
int n,m,l,r;
struct data
{
ll sum;
ll best;
ll lbest;
ll rbest;
}t[4 * maxn];
inline data combo(data a,data b)
{
data tmp;
tmp.sum = a.sum + b.sum;
tmp.lbest = max({tmp.sum,a.lbest,a.sum + b.lbest});
tmp.rbest = max({tmp.sum,b.rbest,b.sum + a.rbest});
tmp.best = max({tmp.lbest,tmp.rbest,a.rbest+b.lbest,tmp.sum,a.best,b.best});
return tmp;
};
inline void build(int nod,int l,int r)
{
if(l == r)
{
t[nod] = {a[l],a[l],a[l],a[l]};
return ;
}
int mid = l + r >> 1;
build(nod << 1,l,mid);
build(nod << 1 | 1,mid + 1,r);
t[nod] = combo(t[nod << 1],t[nod << 1 | 1]);
}
inline data qry(int nod,int tl,int tr,int l,int r)
{
if(l > r) return {-inf,-inf,-inf,-inf};
if(l == tl && r == tr) return t[nod];
int mid = tl + tr >> 1;
return combo(qry(nod << 1,tl,mid,l,min(mid,r)),qry(nod << 1 | 1,mid + 1,tr,max(mid + 1,l),r));
}
int32_t main(){_
freopen("sequencequery.in","r",stdin);
freopen("sequencequery.out","w",stdout);
n = readInt();
m = readInt();
for(int i = 1;i<=n;i++)
a[i] = readInt();
build(1,1,n);
while(m --)
{
l = readInt();
r = readInt();
writeInt(qry(1,1,n,l,r).best,'\n');
}
return 0;
}