Cod sursa(job #332074)

Utilizator antoanelaAntoanela Siminiuc antoanela Data 16 iulie 2009 15:43:02
Problema SequenceQuery Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.56 kb
#include <cstdio>
#include <algorithm>
using namespace std;
#define lm 400000

long long S[lm], Dr[lm], St[lm], R[lm];
int n, m, p, x, a, b; 

void update (int nod, int l, int r)
{
	if (l==r)
	{
		S[nod] = Dr[nod] = St[nod] = R[nod] = x;
		return;
	}
	int m=(l+r)/2;
	if (p<=m) update (2*nod, l, m); 
	else update (2*nod+1, m+1, r);
	S[nod] = S[2*nod] + S[2*nod+1];
	Dr[nod] = max (Dr[2*nod+1], Dr[2*nod] + S[2*nod+1]);
	St[nod] = max (St[2*nod], St[2*nod+1] + S[2*nod]);
	R[nod] = max (max (max (R[2*nod], R[2*nod+1]), max (Dr[2*nod] + St[2*nod+1], S[nod])), max (Dr[nod], St[nod]));
}

struct info
{
	long long r, s, dr, st;
} v; 

void query (int nod, int l, int r)
{
	info x, y;
	if (a<=l && r<=b)
	{
		v.r = R[nod];
		v.s = S[nod];
		v.dr = Dr[nod];
		v.st = St[nod];
		return;
	}
	int m = (l+r)/2;
	x.r = x.s = x.dr = x.st = y.r = y.s = y.dr = y.st = -lm;
	if (a<=m)
	{
		query (2*nod, l, m);
		x.r = v.r;
		x.s = v.s;
		x.dr = v.dr;
		x.st = v.st;
	}
	if (m<b)
	{
		query (2*nod+1, m+1, r);
		y.r = v.r;
		y.s = v.s;
		y.dr = v.dr;
		y.st = v.st;
	}
	v.dr = max (y.dr, y.s + x.dr);
	v.st = max (x.st, x.s + y.st);
	v.s = x.s + y.s;
	v.r = max (max (max (x.r, y.r), max (v.st, v.dr)), max(v.s, x.dr + y.st));
}
	
int main()
{
	freopen("sequencequery.in","r",stdin);
	freopen("sequencequery.out","w",stdout);
	scanf("%d %d",&n,&m);
	int i;
	for (i=1; i<=n; i++)
	{
		scanf("%d",&x);
		p=i;
		update (1, 1, n);
	}
	while (m--)
	{
		scanf("%d %d", &a, &b);
		query (1, 1, n);
		printf("%lld\n", v.r);
	}
}