Pagini recente » Cod sursa (job #1915335) | Cod sursa (job #1535272) | Cod sursa (job #1773811) | Cod sursa (job #2847332) | Cod sursa (job #5560)
Cod sursa(job #5560)
#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;
}