Pagini recente » Cod sursa (job #2650886) | Cod sursa (job #2159587) | Cod sursa (job #799948) | Cod sursa (job #796797) | Cod sursa (job #2322962)
#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 {
if(a.suma == b.suma) {
if( a.s < b.s )
return a;
else if(a.s == b.s) {
if( (a.f - a.s) < (b.f - b.s) )
return a;
else
return b;
}
else
return b;
}
else
return b;
}
}
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=INT_MIN, maxDrM = INT_MIN;
int i, s1=0, s2=0;
int start=m, stop=m;
for(i=m; i>=st; i--) {
s1 += v[i];
if(s1 >= maxStM) {
maxStM = s1;
start = i;
}
}
for(i=m+1; i<=dr; i++) {
s2 += v[i];
if(s2 > maxDrM) {
maxDrM = s2;
stop = i;
}
}
secv s;
s.suma = maxStM+maxDrM;
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;
}