Cod sursa(job #540851)

Utilizator AndreiRSStatescu Andrei Rares AndreiRS Data 24 februarie 2011 15:31:59
Problema SequenceQuery Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.4 kb
#include <fstream>
using namespace std;
const long long INF = ((long long)1 << 60) - 1;
#define DIM 100001

ifstream fi ("sequencequery.in");
ofstream fo ("sequencequery.out");

int N, Q, V[DIM], P, U;
long long R, S;
struct arb { int S, L, R, M; } A[DIM << 2];

long long Max (long long a, long long b, long long c = -INF)
{
	a = a > b ? a : b;
	return a > c ? a : c;
}

void init (int nod, int st, int dr)
{
	if (st == dr)
	{
		A[nod].S = A[nod].L = A[nod].R = A[nod].M = V[st];
		return;
	}	
	int m = (st + dr) >> 1;
	int nodst = nod << 1;
	int noddr = nodst + 1;
	
	init (nodst, st, m);
	init (noddr, m + 1, dr);	
	
	A[nod].S = A[nodst].S + A[noddr].S;
	A[nod].L = Max (A[nodst].L, A[nodst].S + A[noddr].L);
	A[nod].R = Max (A[noddr].R, A[noddr].S + A[nodst].R);
	A[nod].M = Max (A[nodst].R + A[noddr].L, A[nodst].M, A[noddr].M);
}

void query (int nod, int st, int dr)
{
	if (P <= st && dr <= U)
	{
		R = Max (R, A[nod].M, S + A[nod].L);
		S = Max (S + A[nod].S, A[nod].R);
		return;
	}
	int m = (st + dr) >> 1;
	int nodst = nod << 1;
	int noddr = nodst + 1;
	
	if (P <= m)
		query (nodst, st, m);
	if (m < U)
		query (noddr, m + 1, dr);
}

int main ()
{	
	fi >> N >> Q;
	for (int i = 1; i <= N; i++)
		fi >> V[i];
	
	init (1, 1, N);
	for (int i = 1; i <= Q; i++)
	{
		fi >> P >> U;
		R = S = -INF;
		query (1, 1, N);
		fo << R << '\n';
	}	
	return 0;
}