Pagini recente » Cod sursa (job #932246) | Cod sursa (job #2393057) | Cod sursa (job #2237675) | Cod sursa (job #1374833) | Cod sursa (job #1473724)
#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, -INFINIT);
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;
}