Cod sursa(job #2274608)

Utilizator mariusgrafuMarius Grafu mariusgrafu Data 2 noiembrie 2018 10:19:27
Problema Subsecventa de suma maxima Scor 70
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.01 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <limits.h>
using namespace std;

int _l = 0, _r = 0, s = INT_MIN;
vector<int> v;

void divide(int l, int r) {
	cout << s << "\n";
	if (l == r) {
		if (s < v[l]) {
			s = v[l];
			_r = _l = l;
		}
		return;
	}

	int m = (l + r) / 2;
	divide(l, m);
	divide(m + 1, r);

	int r1 = INT_MIN, r2 = INT_MIN, left = 0, right = 0;
	int s_left = 0, s_right = 0;

	for (int i = m; i >= l; --i) {
		s_left += v[i];
		if (r1 <= s_left) {
			r1 = s_left;
			left = i;
		}
	}
	for (int i = m + 1; i <= r; ++i) {
		s_right += v[i];
		if (r2 < s_right) {
			r2 = s_right;
			right = i;
		}
	}
	if (r1 + r2 > s) {
		s = r1 + r2;
		_l = left, _r = right;
	}
}

int main()
{
	ifstream in("ssm.in");
	ofstream out("ssm.out");
	int n;
	in >> n;

	for (int i = 0; i < n; ++i) {
		int x;
		in >> x;
		v.push_back(x);
	}

	divide(0, n - 1);

	out << s << " " << _l + 1 << " " << _r + 1;

	in.close();
	out.close();

	return 0;
}