Pagini recente » Cod sursa (job #1290915) | Cod sursa (job #2023945) | Cod sursa (job #1161567) | Cod sursa (job #1748466) | Cod sursa (job #2275898)
#include <fstream>
#include <climits>
#define nmax 6000005
using namespace std;
int v[nmax];
int Smax=INT_MIN,stMax=INT_MIN,drMax=INT_MIN;
void divide(int st, int dr)
{
int mij=(st+dr)/2;
if (st<dr)
{
divide(st,mij);
divide(mij+1,dr);
int stmax,drmax,sum=0,i,st_suMax,dr_suMax;
st_suMax=INT_MIN;
sum=0;
for (i=mij;i>=st;i--)
{
sum+=v[i];
if (sum>st_suMax)
{
st_suMax=sum;
stmax=i;
}
}
dr_suMax=INT_MIN;
sum=0;
for (i=mij+1;i<=dr;i++)
{
sum+=v[i];
if (sum>dr_suMax)
{
dr_suMax=sum;
drmax=i;
}
}
if (st_suMax+dr_suMax==Smax)
{
if (stMax==stmax)
{
if (drMax>drmax)
{
stMax=stmax;
drMax=drmax;
}
}
else
if (stMax>stmax)
{
stMax=stmax;
drMax=drmax;
}
}
else
if (st_suMax+dr_suMax>Smax)
{
Smax=st_suMax+dr_suMax;
stMax=stmax;
drMax=drmax;
}
}
}
int main()
{
ifstream fin("ssm.in");
ofstream fout("ssm.out");
int n,i;
fin>>n;
for (i=1;i<=n;i++)
fin>>v[i];
divide(1,n);
fout<<Smax<<' '<<stMax<<' '<<drMax<<'\n';
fin.close();
fout.close();
return 0;
}