Pagini recente » Cod sursa (job #1382758) | Cod sursa (job #2490547) | Cod sursa (job #1009579) | Cod sursa (job #1300330) | Cod sursa (job #2323244)
#include <bits/stdc++.h>
int n,a[6000003];
using namespace std;
struct elem{
int s, st, dr;
bool operator <(const elem &other)
const
{
if(s<other.s)
return true;
if(s==other.s)
{
if(st!=other.st)
return st<other.st;
return dr<other.dr;
}
if(s>other.s)
return false;
}
}SOL;
void Citire()
{
int i;
ifstream fin("ssm.in");
fin>>n;
for(i=1;i<=n;++i)
fin>>a[i];
fin.close();
}
elem SolMijl(int arr[], int l, int m, int h)
{
int i, sum = 0, left_sum = INT_MIN, right_sum = INT_MIN, STANGA, DREAPTA;
elem w;
for (i = m; i >= l; --i)
{
sum = sum + arr[i];
if (sum > left_sum)
{
left_sum = sum;
STANGA = i;
}
}
sum = 0;
for (i = m+1; i <= h; ++i)
{
sum = sum + arr[i];
if (sum > right_sum)
{
right_sum = sum;
DREAPTA = i;
}
}
w.dr = DREAPTA;
w.st = STANGA;
w.s = left_sum + right_sum;
return w;
}
elem Divide(int arr[], int stg, int drp)
{
if (stg == drp)
{
elem w;
w.dr=drp;
w.st=stg;
w.s = arr[stg];
return w;
}
int m = (stg + drp)/2;
return max(Divide(arr, stg, m),max(Divide(arr, m+1, drp), SolMijl(arr, stg, m, drp)));
}
void Afisare()
{
ofstream fout("ssm.out");
elem w;
w = Divide(a,1,n);
fout<<w.s<<" "<<w.st<<" "<<w.dr<<"\n";
fout.close();
}
int main()
{
SOL.st = SOL.dr = -1;
SOL.s = INT_MIN;
Citire();
Afisare();
return 0;
}