#include <fstream>
using namespace std;
ifstream fin("sequencequery.in");
ofstream fout("sequencequery.out");
#define INF 0x3f3f3f3f
#define NMAX 100001
#define L (n << 1)
#define R (L | 1)
int i, j, N, M;
int best, sum;
int x, y;
int v[NMAX];
int Ans[3 * NMAX];
int Sum[3 * NMAX];
int Left[3 * NMAX];
int Right[3 * NMAX];
inline void build(int n, int l, int r) {
if (l == r){
Sum[n] = Left[n] = Right[n] = v[l];
Ans[n] = v[l];
return;
}
int m = (l + r) >> 1;
build(L, l, m);
build(R, m + 1, r);
Sum[n] = Sum[L] + Sum[R];
Left[n] = max(Left[n], max(Left[L], Sum[L] + Left[R]));
Right[n] = max(Right[n], max(Right[R], Sum[R] + Right[L]));
Ans[n] = max(Ans[n], max(Ans[L], Ans[R]));
Ans[n] = max(Ans[n], Right[L] + Left[R]);
}
inline void query(int n, int l, int r, int i, int j) {
if (i <= l && r <= j) {
sum = max(sum + Sum[n], Right[n]);
best = max(best, max(sum, Ans[n]));
return;
}
int m = (l + r) >> 1;
if (i <= m) query(L, l, m, i, j);
if (j > m) query(R, m + 1, r, i, j);
}
int main() {
fin >> N >> M;
for (i = 1; i <= N; ++i) fin >> v[i];
build(1, 1, N);
while (M--) {
sum = best = -INF;
fin >> x >> y;
query(1, 1, N, x, y);
fout << best << '\n';
}
return 0;
}