Pagini recente » Cod sursa (job #193745) | Cod sursa (job #1130786) | Cod sursa (job #1304736) | Cod sursa (job #1593545) | Cod sursa (job #682720)
Cod sursa(job #682720)
#include <cstdio>
#include <algorithm>
#include <iostream>
using namespace std;
int v[6000005], s[6000005], n, sol, xs, ys;
pair < int, pair < int, int > > divide(int a, int b)
{
int i, x, y, curr, maxim = 0, maxim2 = 0;
//cerr << a << ' ' << b << "\n";
if(b - a == 0)
return make_pair(v[a], make_pair(a, b));
pair <int, pair <int, int > > left, right;
left = divide(a, (a + b) / 2);
right = divide((a + b) / 2 + 1, b);
for(i = a; i <= b; ++i) {
if(s[i] - s[a - 1] > maxim) {
maxim = s[i] - s[a - 1];
x = i;
}
}
for(i = b; i >= a; --i)
if(s[b] - s[i - 1] > maxim2) {
maxim2 = s[b] - s[i - 1];
y = i;
}
int leftSum = s[(a + b) / 2] - s[left.second.second - 1];
int rightSum = s[right.second.first] - s[(a + b) / 2];
curr = max(left.first, max(right.first, leftSum + rightSum));
if(curr > sol) {
sol = curr;
xs = left.second.second;
ys = right.second.first;
}
// cerr << a << ' ' << b << ' ' << curr << "\n";
return make_pair(curr, make_pair(x, y));
}
int main()
{
int i;
freopen ("ssm.in", "r", stdin);
freopen ("ssm.out", "w", stdout);
scanf("%d", &n);
for(i = 1; i <= n; ++i)
scanf("%d", &v[i]);
for(i = 1; i <= n; ++i)
s[i] = s[i - 1] + v[i];
divide(1, n);
printf("%d %d %d", sol, xs, ys);
return 0;
}