Pagini recente » Cod sursa (job #2662681) | Cod sursa (job #1857806) | Borderou de evaluare (job #977963) | Cod sursa (job #2480105) | Cod sursa (job #2274905)
#include <iostream>
#include<stdio.h>
#include <fstream>
using namespace std;
#define INF 1000000006
int n, v[6000006];
int ans=-INF, lleft, rright;
void divide(int st, int dr) {
if(st >= dr) {
// v[st]
if(v[st] > ans) {
ans = v[st];
lleft = st;
rright = st;
}
else if(v[st] == ans) {
if(st < lleft) {
lleft = rright = st;
}
else if(st == lleft) {
rright = st;
}
}
return ;
}
int m,s_st = -INF, p_st = 0, s_dr = -INF, p_dr = 0, i, s=0;
m = (st + dr) / 2;
divide(st, m);
divide(m + 1, dr);
for(i=m;i>=st;i--) {
s = s + v[i];
if(s >= s_st) {
s_st = s;
p_st = i;
}
}
s=0;
for(i=m+1;i<=dr;i++) {
s = s + v[i];
if(s > s_dr) {
s_dr = s;
p_dr = i;
}
}
// printf("%d %d (%d %d) (%d %d)\n", st, dr, s_st, p_st, s_dr, p_dr);
if(s_st + s_dr > ans) {
ans = s_st + s_dr;
lleft = p_st;
rright = p_dr;
}
else if(s_st + s_dr == ans) {
if(p_st < lleft) {
lleft = p_st;
rright = p_dr;
}
else if(p_st == lleft && p_dr < rright) {
rright = p_dr;
}
}
}
int main()
{
int i;
ifstream f("ssm.in");
f>>n;
for(i=0;i<n;i++) {
f>>v[i];
//cout << v[i];
}
divide(0,n-1);
cout << ans << " " << lleft + 1 << " " << rright + 1 << "\n";
ofstream g("ssm.out");
g<<ans<<" "<<lleft +1<<" "<<rright + 1<<"\n";
return 0;
}