Pagini recente » Cod sursa (job #1585101) | Cod sursa (job #947012) | Cod sursa (job #1091220) | Cod sursa (job #945634) | Cod sursa (job #2608556)
#include <fstream>
#include <tuple>
#include <utility>
using namespace std;
int arr[6'000'005];
ifstream fin("ssm.in");
ofstream fout("ssm.out");
int bestSum = -int(2e9);
int Begin, End;
tuple<pair<int, int>, int> maxSum(int left, int right) {
if (left == right) {
if (bestSum < arr[left]) {
bestSum = arr[left];
Begin = left;
End = left;
}
return make_tuple(make_pair(left, left), arr[left]);
}
int mid = left + (right - left) / 2;
tuple<pair<int, int>, int> leftSide = maxSum(left, mid);
tuple<pair<int, int>, int> rightSide = maxSum(mid + 1, right);
int leftSideMaxSum = get<1>(leftSide);
int rightSideMaxSum = get<1>(rightSide);
if ((get<0>(leftSide)).second + 1 == (get<0>(rightSide)).first and leftSideMaxSum + rightSideMaxSum > 0) {
if (leftSideMaxSum + rightSideMaxSum > bestSum) {
bestSum = leftSideMaxSum + rightSideMaxSum;
Begin = (get<0>(leftSide)).first;
End =(get<0>(rightSide)).second;
}
return make_tuple(make_pair((get<0>(leftSide)).first, (get<0>(rightSide)).second), leftSideMaxSum + rightSideMaxSum);
}
if (leftSideMaxSum > rightSideMaxSum) {
if (bestSum < leftSideMaxSum) {
bestSum = leftSideMaxSum;
Begin = (get<0>(leftSide)).first;
End = (get<0>(leftSide)).second;
}
return leftSide;
} else {
if (bestSum < rightSideMaxSum) {
bestSum = rightSideMaxSum;
Begin = (get<0>(rightSide)).first;
End = (get<0>(rightSide)).second;
}
return rightSide;
}
}
int main() {
int n;
fin >> n;
for (int i = 0;i < n;i ++)
fin >> arr[i];
tuple<pair<int, int>, int> max_sum = maxSum(0, n - 1);
fout << bestSum << ' ' << Begin + 1 << ' ' << End + 1;
return 0;
}