Pagini recente » Cod sursa (job #2201365) | Cod sursa (job #2556592) | Cod sursa (job #359113) | Cod sursa (job #2263383) | Cod sursa (job #2269870)
#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);
if(rez.sum==0 && rez.ind1==0 && rez.ind2==0){
int maxim = v[1],in=1;
for(int i=2;i<=n;i++){
if(v[i]>maxim){
maxim = v[i];
in=i;
}
}
fout<<maxim<<" "<<in<<" "<<in;
return 0;
}
fout<<rez.sum<<" "<<rez.ind1<<" "<<rez.ind2;
return 0;
}