Pagini recente » Cod sursa (job #1769375) | Cod sursa (job #2743572) | Cod sursa (job #618570) | Cod sursa (job #2619218) | Cod sursa (job #2273605)
#include <bits/stdc++.h>
#define nmax 6000010
#define minusinf -20000
using namespace std;
ifstream fin("ssm.in");
ofstream fout("ssm.out");
int S[nmax];
int sol = minusinf,l,r;
void divide(int left, int right)
{
if (left == right)
{
if(S[left] > sol)
{
sol = S[left];
l = left;
r = right;
}
else if (S[left] == sol )
{
if (left < l)
l = left;
else if (left == l)
r = min(r,right);
}
return;
}
int mid = (left+right)/2;
divide(left,mid);
divide(mid+1,right);
int r1 = minusinf,suma1 = 0, suma2 = 0 , r2 = minusinf,p1 = mid,p2 = mid + 1;
for (int L1 = mid; L1 >= left; L1--)
{
suma1 += S[L1];
if (r1 <= suma1)
{
r1 = suma1;
p1 = L1;
}
}
for (int L2 = mid+1; L2 <= right; L2++)
{
suma2 += S[L2];
if (r2 < suma2)
{
r2 = suma2;
p2 = L2;
}
}
if (r1 + r2 > sol)
{
sol = r1 + r2;
l = p1;
r = p2;
}
else if (r1 +r2 == sol )
{
if (l == p1)
{
r = min(r,p2);
}
else
l = min(l,p1);
}
}
int main()
{
ios_base::sync_with_stdio(0);
fin.tie(0); fout.tie(0);
int n;
fin >> n;
for (int i = 1 ; i <= n; i++)
fin >> S[i];
divide(1,n);
fout << sol << " " << l << " " << r;
return 0;
}