Cod sursa(job #5560)

Utilizator MariusMarius Stroe Marius Data 13 ianuarie 2007 10:35:11
Problema A+B Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.05 kb
#include <cstdio>
using namespace std;

const char iname[] = "2sec.in";
const char oname[] = "2sec.out";

#define MAX_N 1001005
#define ultbit(z) ((z) ^ ((z) & ((z) - 1)))

int A[MAX_N], Min[MAX_N];


void update(int V[], int lo, int hi, int info)
{
	for (; lo <= hi; lo += ultbit(lo))
		if (V[lo] > info)	V[lo] = info;
}

int query(int V[], int hi)
{
	int min = 128 * MAX_N;
	for (; 0 < hi; hi -= ultbit(hi))
		if (min > V[hi])   min = V[hi];
	return min;
}

int main(void)
{
	freopen(iname, "r", stdin);
	freopen(oname, "w", stdout);
	int n;
	int i;
	int sum = 0;
	int Rez = - 128 * MAX_N;

	for (scanf("%d", & n), i = 1; i <= n; ++i)
		scanf("%d", A + i);
	for (i = 1; i <= n; ++i)
		Min[i] = 128 * MAX_N;
	for (i = 1; i <= n; ++i) {
		if (sum < 0)
			sum += A[i];
		else
			sum  = A[i];
		update(Min, i, n, sum);
	}
	for (sum = 0, i = n; i > 1; --i) {
		if (sum > 0)
			sum += A[i];
		else
			sum  = A[i];
		int qry = query(Min, i - 1);
		if (sum - qry > Rez)
			Rez = sum - qry;
	}
	printf("%d\n", Rez);

	return 0;
}