Cod sursa(job #1550012)

Utilizator alexandru822Bosinta Alexandru alexandru822 Data 13 decembrie 2015 01:16:05
Problema Subsecventa de suma maxima Scor 65
Compilator cpp Status done
Runda Arhiva educationala Marime 1.57 kb
#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;
}