Pagini recente » Cod sursa (job #470527) | Cod sursa (job #1140534) | Cod sursa (job #2384342) | Cod sursa (job #2625804) | Cod sursa (job #2938665)
#include <fstream>
#include <climits>
using namespace std;
const int Nmax = 6000005;
struct Ssm {
int sum, left, right;
};
int n, a[Nmax];
Ssm solve(int a[], int left, int right) {
if(left == right) {
return {a[left], left, right};
}
int middle = (left + right) / 2;
Ssm ssmLeft = solve(a, left, middle);
Ssm ssmRight = solve(a, middle + 1, right);
int sum = 0, maxSum = -INT_MAX, bestSt, bestDr;
for(int st = middle; st >= left; st--) {
sum += a[st];
if(sum > maxSum) {
maxSum = sum;
bestSt = st;
}
}
int bestSum = maxSum;
sum = 0; maxSum = -INT_MAX;
for(int dr = middle + 1; dr <= right; dr++) {
sum += a[dr];
if(sum > maxSum) {
maxSum = sum;
bestDr = dr;
}
}
bestSum += maxSum;
Ssm sol;
if(ssmLeft.sum >= ssmRight.sum) {
sol = ssmLeft;
}
else {
sol = ssmRight;
}
if(bestSum > sol.sum) {
sol = {bestSum, bestSt, bestDr};
}
else if(bestSum == sol.sum && (bestSt < sol.left || (bestSt == sol.left && bestDr < sol.right))) {
sol = {bestSum, bestSt, bestDr};
}
return sol;
}
int main() {
ifstream fin("ssm.in");
ofstream fout("ssm.out");
fin >> n;
for(int i = 1; i <= n; i++) {
fin >> a[i];
}
Ssm answer = solve(a, 1, n);
fout << answer.sum << " " << answer.left << " " << answer.right << "\n";
return 0;
}