Cod sursa(job #2608556)

Utilizator michael_blazemihai mihai michael_blaze Data 1 mai 2020 14:57:48
Problema Subsecventa de suma maxima Scor 10
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.69 kb
#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;
}