Cod sursa(job #1473722)

Utilizator mouse_wirelessMouse Wireless mouse_wireless Data 20 august 2015 00:27:33
Problema Subsecventa de suma maxima Scor 95
Compilator cpp Status done
Runda Arhiva educationala Marime 1.32 kb
#include <cstdio>
#include <vector>
#include <algorithm>
#include <cctype>
#include <cstring>
using namespace std;

template <class T> void readNum(T &nr) {
	nr = 0;
	T sign = 1;
	char c;
	while (!isdigit(c = getchar()))
		(c == '-') && (sign = -1);
	do {
		nr = nr * 10 + c - '0';
	} while (isdigit(c = getchar()));
	nr *= sign;
}

#define MAXN 10000010
#define INFINIT 2000000000
vector<int> v;
vector< pair<int, int> > subseq;

class range {
public:
	int left, right, sum;
	range(int L, int R, int S) {
		this->assign(L, R, S);
	}
	void assign(int L, int R, int S) {
		left = L;
		right = R;
		sum = S;
	}
};

range computeMaxSum() {
	range mxx(-1, -1, 0);
	range cur(-1, -1, 0);
	for (int i = 0; i < int(v.size()); i++) {
		if (v[i] == -INFINIT) {
			cur.assign(-1, -1, 0);
			continue;
		}
		cur.right = i;
		cur.sum += v[i];
		if (cur.left == -1)
			cur.left = i;
		if (cur.sum > mxx.sum)
			mxx = cur;
		if (cur.sum < 0)
			cur.assign(-1, -1, 0);
	}
	return mxx;
}

int main() {
	v.reserve(MAXN);
	subseq.reserve(31);

	freopen("ssm.in", "r", stdin);
	freopen("ssm.out", "w", stdout);
	int N;
	readNum(N);
	v.resize(N);
	for (int i = 0; i < N; i++)
		readNum(v[i]);
	range aux = computeMaxSum();
	printf("%d %d %d\n", aux.sum, aux.left + 1, aux.right + 1);

	return 0;
}