Cod sursa(job #1148262)

Utilizator antonioteoZait Teodor Antonio antonioteo Data 20 martie 2014 17:19:42
Problema SequenceQuery Scor 0
Compilator cpp Status done
Runda oni2014_ziua_iii Marime 1.25 kb
#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;
}