Pagini recente » Cod sursa (job #2408067) | Cod sursa (job #1257512) | Cod sursa (job #2519822) | Cod sursa (job #46850) | Cod sursa (job #5565)
Cod sursa(job #5565)
#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;
}