Cod sursa(job #179870)

Utilizator anoukAnca Dumitrache anouk Data 16 aprilie 2008 13:43:06
Problema SequenceQuery Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.28 kb
#include <cstdio>
#define DIM (1 << 18)
#define pivot ((st + dr) >> 1)
#define max(a, b) ((a) > (b) ? (a) : (b))
using namespace std;

int N, M, X, Y;
long long V[DIM], A[DIM << 1], B[DIM << 1], C[DIM << 1], S[DIM << 1], sum, sol;

void Build(int nod, int st, int dr)
{
	if (st == dr)
	{
		A[nod] = B[nod] = C[nod] = S[nod] = V[st];
		return;
	}
	Build(2 * nod, st, pivot);
	Build(2 * nod + 1, pivot + 1, dr);
	A[nod] = max(A[2 * nod], A[2 * nod + 1] + S[2 * nod]);
	B[nod] = max(B[2 * nod + 1], S[2 * nod + 1] + B[2 * nod]);
	C[nod] = max(max (C[2 * nod], C[2 * nod + 1]), A[2 * nod + 1] + B[2 * nod]);
	S[nod] = S[2 * nod] + S[2 * nod + 1];
}

void Query(int nod, int st, int dr)
{
	if (X <= st && dr <= Y)
	{
		sol = max(sol, max(sum + A[nod], C[nod]));
		sum = max(sum + S[nod], B[nod]);
		return;
	}
	if (X <= pivot) Query(2 * nod, st, pivot);
	if (Y >  pivot) Query(2 * nod + 1, pivot + 1, dr);
}

int main()
{
	FILE *fin = fopen("sequencequery.in", "r");
	FILE *fout = fopen("sequencequery.out", "w");

	fscanf(fin, "%d%d", &N, &M);
	for (int i = 1; i <= N; i++)
		fscanf(fin, "%lld", V + i);
	Build(1, 1, N);
	for (int i = 1; i <= M; i++)
	{
		fscanf(fin, "%d%d", &X, &Y);
		sum = 0;
		sol = -9999999;
		Query(1, 1, N);
		fprintf(fout, "%lld\n", sol);
	}

	fclose(fin);
	fclose(fout);
	return 0;
}