Cod sursa(job #2323244)

Utilizator SmitOanea Smit Andrei Smit Data 18 ianuarie 2019 23:20:10
Problema Subsecventa de suma maxima Scor 65
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.72 kb
#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;
}