Pagini recente » Cod sursa (job #2501942) | Cod sursa (job #2987463) | Cod sursa (job #439641) | Cod sursa (job #2179703) | Cod sursa (job #2269861)
#include <iostream>
#include <fstream>
using namespace std;
int *v;
struct secv{
int sum, ind1,ind2;
};
secv maxi(secv a, secv b){
if(a.sum<b.sum) return b;
if(a.sum>b.sum) return a;
if(a.ind1<b.ind1) return a;
if(a.ind1>b.ind1) return b;
if((a.ind2-a.ind1)>(b.ind2-b.ind1)) return b;
return a;
}
secv divide(int l,int r){
int m = (l+r)/2;
secv r1,r2;
if(l==r){
secv x;
x.sum = v[l];
x.ind1 = l;
x.ind2 = r;
return x;
}
r1 = divide(l,m);
r2 = divide(m+1,r);
int s=0;
secv sl,sr;
sl.sum = 0;
sl.ind1 = 0;
sl.ind2 = m;
sr.sum = 0;
sr.ind1 = m+1;
sr.ind2 = 0;
for(int i = m;i>=l;i--){
s+=v[i];
if(s>sl.sum){
sl.ind1 = i;
sl.sum = s;
}
}
s = 0;
for(int i = m+1;i<=r;i++){
s+=v[i];
if(s>sr.sum){
sr.ind2=i;
sr.sum = s;
}
}
secv r3;
r3.sum = sl.sum + sr.sum;
r3.ind1 = sl.ind1;
r3.ind2 = sr.ind2;
return maxi(maxi(r1,r2),r3);
}
int main()
{
ifstream fin("ssm.in");
ofstream fout("ssm.out");
int n;
fin>>n;
v = new int[n+1];
for(int i=1;i<=n;i++) fin>>v[i];
secv rez = divide(1,n);
fout<<rez.sum<<" "<<rez.ind1<<" "<<rez.ind2;
return 0;
}