Pagini recente » Cod sursa (job #1149674) | Cod sursa (job #3180760) | Cod sursa (job #3191027) | Cod sursa (job #3181533) | Cod sursa (job #2916404)
#include <bits/stdc++.h>
using namespace std;
ifstream fin( "ssm.in" );
ofstream fout( "ssm.out" );
const int MAXN = 6e6 + 1;
const int INF = 1e9;
struct ssm {
int val, l, r, pref, suff, p, s;
};
int v[MAXN];
int S[MAXN];
inline void upd( ssm &crt, ssm now ) {
if ( crt.val < now.val ) {
crt = now;
} else if ( crt.val == now.val && crt.l > now.l ) {
crt = now;
} else if ( crt.val == now.val && crt.l == now.l && crt.r > now.r ) {
crt = now;
}
}
ssm getBest( int st, int dr ) {
if ( st == dr ) return {v[st], st, st, v[st], v[st], st, st};
int mid = (st + dr) / 2;
ssm X = getBest( st, mid );
ssm Y = getBest( mid + 1, dr );
ssm res = {-INF, 0, 0, 0, 0, 0, 0};
upd(res, X);
upd(res, Y);
upd(res, {X.suff + Y.pref, X.s, Y.p, 0, 0, 0, 0});
if ( X.pref >= S[mid] - S[st - 1] + Y.pref ) {
res.pref = X.pref;
res.p = X.p;
} else {
res.pref = S[mid] - S[st - 1] + Y.pref;
res.p = Y.p;
}
if ( Y.suff > S[dr] - S[mid] + X.suff ) {
res.suff = Y.suff;
res.s = Y.s;
} else {
res.suff = S[dr] - S[mid] + X.suff;
res.s = X.s;
}
return res;
}
int main() {
int n;
fin >> n;
for ( int i = 1; i <= n; ++i ) {
fin >> v[i];
S[i] = S[i-1] + v[i];
}
ssm res = getBest(1, n);
fout << res.val << " " << res.l << " " << res.r;
fin.close();
fout.close();
return 0;
}