Cod sursa(job #5565)

Utilizator gigi_becaliGigi Becali gigi_becali Data 13 ianuarie 2007 11:12:58
Problema A+B Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.31 kb
#include <cstdio>
#define maxn 1001005

short x[maxn];
int n;
int s[maxn], s2[maxn];
int Max[maxn], Min[maxn];
int pz1[maxn], pz2[maxn];
void citire()
{
	freopen("2sec.in", "r", stdin);
	scanf("%d\n", &n);
	int i;
	for(i=1;i<=n;i++) scanf("%d ", x+i);
}
int min(int a, int b)
{
	if(a<b) return a;
	return b;
}
int maxim(int a, int b)
{
	if(a>b) return a;
	return b;
}

void calcul()
{
	int i, j;
	int ok=1;
	s[1]=x[1];
	for(i=2;i<=n;i++) s[i]=x[i]+s[i-1];
	s2[n]=x[n];
	for(i=n-1;i>0;i--) s2[i]=s2[i+1]+x[i];
	
	for(i=1;i<=n;i++) if(x[i]<0) ok=0;
	if(ok)
	{
		
		int max=0;
		for(i=1;i<n;i++)
			if((s[n]-s[i])-x[i]>max) max=(s[n]-s[i])-x[i];
		printf("%d\n", max); return ;
	}
	else
	{	int max=0;
		Min[1]=s2[1];
		Max[n]=s[n];
		pz1[1]=1;
		
		for(i=2;i<=n;i++)
		{
			Min[i]=min(Min[i-1], s2[i]);
			if(Min[i]!=s2[i]) pz1[i]=pz1[i-1];
			else pz1[i]=i;
		}
		pz2[n]=1;
		for(i=n-1;i>0;i--) 
		{
			Max[i]=maxim(Max[i+1], s[i]);
			if(Max[i]!=s[i]) pz2[i]=pz2[i+1];
			else pz2[i]=i;
		}

			
		int sol=0;
		for(i=1;i<n;i++)
		{
			int p=pz2[i+1];
			int q=pz1[i];
			if((s[p]-s[i]) -(s[i]-s[q-1])>sol) sol=(s[p]-s[i])-(s[i]-s[q-1]);
			
		
		}
		freopen("2sec.out", "w", stdout);
		printf("%d\n", sol);
	}
}

int main()
{
	citire();
	calcul();
	return 0;
}