#include <iostream>
#define NMAX 100000
#define INFINIT 100001
using namespace std;
struct Node {
int pref ;
int suf ;
int ssm ;
int s ;
};
struct Aint {
Node aint [ 4 * NMAX + 1 ] ;
Aint (int n) {
for (int i = 0 ; i <= n ; i++ )
this->aint[i] = {-INFINIT, -INFINIT, -INFINIT, -INFINIT} ;
}
Node join (Node node1, Node node2 ) {
Node rez ;
rez.s = node1.s + node2.s ;
rez.ssm = max ( node1.suf + node2.pref, max(node1.ssm, node2.ssm)) ;
rez.pref = max ( node1.s + node2.pref, node1.pref) ;
rez.suf = max ( node2.suf, node2.s + node1.suf ) ;
return rez ;
}
void update (int node, int st, int dr, int poz, int val ) {
if (poz < st || poz > dr )
return ;
else {
if (st == dr )
this->aint[node] = {val, val, val, val} ;
else {
int mij = (st + dr ) / 2 ;
update (2*node, st, mij, poz, val ) ;
update (2*node+1, mij+1, dr, poz, val ) ;
aint[node] = join(this->aint[2*node], this->aint[2*node+1]) ;
}
}
}
Node query (int node, int st, int dr, int left, int right) {
if (right < st || left > dr )
return {-INFINIT, -INFINIT, -INFINIT, -INFINIT} ;
else {
if (st >= left && dr <= right ) {
return aint[node] ;
}
else {
int mij = ( st + dr ) / 2 ;
return this->join(query(2 * node, st, mij, left, dr), query(2*node+1, mij+1, dr, left, right)) ;
}
}
}
};
int v [ NMAX + 1 ] ;
Aint a(NMAX) ;
int main() {
FILE *fin, *fout ;
fin = fopen ("sequencequery.in", "r" ) ;
fout = fopen ("sequencequery.out", "w" ) ;
int n, i, m, st, dr ;
fscanf (fin, "%d%d", &n, &m ) ;
for (i = 1 ; i <= n ; i++) {
fscanf (fin, "%d", &v[i] ) ;
a.update(1, 1, n, i, v[i] ) ;
}
for (i = 1 ; i <= m ; i++ ) {
fscanf (fin, "%d%d", &st, &dr ) ;
fprintf (fout, "%d\n", a.query(1, 1, n, st, dr).ssm ) ;
}
return 0;
}