Cod sursa(job #2273598)

Utilizator slym777Darii Dan slym777 Data 31 octombrie 2018 19:44:35
Problema Subsecventa de suma maxima Scor 95
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.66 kb
#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)
{
    //cout << "\n sol = " << sol << "\n";
    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()
{
    int n;
    fin >> n;
    for (int i = 1 ; i <= n; i++)
        fin >> S[i];
    divide(1,n);
    //cout << sol << " " << l << " " << r;
    fout << sol << " " << l << " " << r;
    return 0;
}