Pagini recente » Cod sursa (job #665618) | Cod sursa (job #89078) | Cod sursa (job #942016) | Monitorul de evaluare | Cod sursa (job #2322869)
#include <iostream>
#include <fstream>
#include <vector>
#include <limits.h>
using namespace std;
ifstream fin("ssm.in");
ofstream fout("ssm.out");
vector <int> v;
int secvStart, secvStop;
struct secv {
int suma;
int s, f;
};
secv maxim( secv a, secv b) {
if(a.suma > b.suma)
return a;
else
return b;
}
int maxSt = INT_MAX;
int maxDr = INT_MAX;
secv subsMax( int st, int dr ){
if(st == dr) {
secv s;
s.suma = v[st];
s.s = s.f = st;
return s;
}
int m = (st+dr) / 2;
secv maxSt = subsMax(st, m);
secv maxDr = subsMax(m+1, dr);
int maxStM=0, maxDrM = 0;
int i, s1=0, s2=0;
int start, stop;
for(i=m; i>=st; i--) {
maxStM += v[i];
if(maxStM > s1) {
s1 = maxStM;
start = i;
}
}
for(i=m+1; i<=dr; i++) {
maxDrM += v[i];
if(maxDrM > s2) {
s2 = maxDrM;
stop = i;
}
}
//for(i=st; i<=dr; i++) {
// cout<<v[i]<<" ";
//}
//cout<<endl;
//cout<<maxSt<<" "<<maxDr<<" "<<s1<<" "<<s2;
//cout<<endl;
secv s;
s.suma = s1+s2;
s.s = start;
s.f = stop;
return maxim( maxim(maxSt, maxDr), s);
}
int main()
{
int n;
fin>>n;
int i;
v.push_back(INT_MIN);
for(i=1; i<=n; i++)
{
int x;
fin>>x;
v.push_back(x);
}
secv sol = subsMax(1, n);
fout<<sol.suma<<" "<<sol.s<<" "<<sol.f;
}