Pagini recente » Cod sursa (job #1547656) | Cod sursa (job #1354955) | Cod sursa (job #2560135) | Cod sursa (job #1775665) | Cod sursa (job #2274144)
#include <iostream>
#include <fstream>
#define Nmax 6000005
using namespace std;
ifstream fin("ssm.in");
ofstream fout("ssm.out");
int v[Nmax];
struct returnare
{
int valoare, stanga,dreapta;
};
returnare divide (int left,int right)
{
if (left==right) {returnare r; r.valoare=v[left];r.stanga=r.dreapta=left; return r;}
int mid=(left+right)/2;
returnare r1=divide (left,mid);
returnare r2=divide (mid+1,right);
int maxim_Stanga=0,maxim_Dreapta=0;
int sumaP1=0,sumaP2;
int pozStanga,pozDreapta;
for (int i=mid;i>=left;i--)
{
sumaP2=sumaP1+v[i];
if (sumaP2>maxim_Stanga) {maxim_Stanga=sumaP2;pozStanga=i;}
sumaP1=sumaP2;
}
sumaP1=0;
for (int i=mid+1;i<=right;i++)
{
sumaP2=sumaP1+v[i];
if (sumaP2>maxim_Dreapta) {maxim_Dreapta=sumaP2;pozDreapta=i;}
sumaP1=sumaP2;
}
returnare r3;
r3.valoare=maxim_Dreapta+maxim_Stanga;
r3.stanga=pozStanga;
r3.dreapta=pozDreapta;
if (r1.valoare>r3.valoare) r3=r1;
if(r2.valoare>r3.valoare) r3=r2;
if (r2.valoare==r3.valoare&&r2.stanga<r3.stanga) r3=r2;
if (r1.valoare==r3.valoare&&r1.stanga<r3.stanga) r3=r1;
if (r2.valoare==r3.valoare&&r2.stanga==r3.stanga&&r2.dreapta-r2.stanga<r3.dreapta-r3.stanga) r3=r2;
if (r1.valoare==r3.valoare&&r1.stanga==r3.stanga&&r1.dreapta-r1.stanga<r3.dreapta-r3.stanga) r3=r1;
return r3;
}
int main()
{int n;
fin>>n;
for (int i=1;i<=n;i++)
fin>>v[i];
returnare r=divide(1,n);
fout<<r.valoare<<" "<<r.stanga<<" "<<r.dreapta;
return 0;
}