Pagini recente » Statistici UCV Mocioaca Popa Calina (UCV_Mocioaca_Popa_Calina) | Cod sursa (job #259518) | Cod sursa (job #200200) | Cod sursa (job #1662074) | Cod sursa (job #1550012)
#include <fstream>
#include <climits>
using namespace std;
ofstream out("ssm.out");
ifstream in("ssm.in");
int v[6000001];
struct AnswerType
{
long long maxSum;
int start;
int stop;
};
AnswerType ssm(int l, int r)
{
if(l == r)
return {v[l],l,l};
AnswerType answer;
int mid = (l+r)/2;
AnswerType bestL = ssm(l,mid);
AnswerType bestR = ssm(mid+1,r);
AnswerType joined;
int current = 0;
long long premax = LLONG_MIN, postmax = LLONG_MIN;
for(int i = mid; i >= l; i--)
{
current += v[i];
if(premax < current)
{
premax = current;
joined.start = i;
}
}
current = 0;
for(int i = mid + 1; i <= r; i++)
{
current += v[i];
if(postmax < current)
{
postmax = current;
joined.stop = i;
}
}
joined.maxSum = premax + postmax;
answer = bestL;
if(answer.maxSum < bestR.maxSum)
{
answer = bestR;
}
if(answer.maxSum < joined.maxSum)
{
answer = joined;
} else if(answer.maxSum == joined.maxSum)
{
if(answer.start > joined.start)
answer = joined;
else if(answer.start == joined.start && answer.stop < joined.stop)
answer = joined;
}
return answer;
}
int main()
{
int n;
in >> n;
for(int i = 1; i <= n; i++)
in >> v[i];
AnswerType answer = ssm(1, n);
out << answer.maxSum << " " << answer.start << " " << answer.stop;
return 0;
}