Cod sursa(job #2798078)

Utilizator mariaionescu2006Ionescu Maria mariaionescu2006 Data 10 noiembrie 2021 21:23:18
Problema Subsecventa de suma maxima Scor 65
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.14 kb
#include <iostream>
#include <fstream>
using namespace std;
ifstream fin ("ssm.in");
ofstream fout ("ssm.out");
struct ssm{
    int sum,l,r;
};
int n,a[6000001];
ssm solve (int a[],int l,int r)
{
    if (l==r) {return {a[l],l,r};}
    int mid=(l+r)/2;
    ssm ssml=solve(a,l,mid);
    ssm ssmr=solve(a,mid+1,r);
    int sum=0,msum=-2147483647,bestst,bestdr;
    for (int st=mid;st>=l;st--)
    {
        sum+=a[st];
        if (sum>msum) {msum=sum;
                       bestst=st;}
    }
    int bestsum=msum;
    sum=0,msum=-2147483647;
    for (int dr=mid+1;dr<=r;dr++)
    {
        sum+=a[dr];
        if (sum>msum) {msum=sum;
                       bestdr=dr;}
    }
    bestsum+=msum;
    ssm sol;
    if (ssml.sum>=ssmr.sum) sol=ssml;
    else sol=ssmr;
    if (bestsum>sol.sum) sol={bestsum,bestst,bestdr};
    else if (bestsum==sol.sum && (bestst<sol.l || (bestst==sol.l && bestdr<sol.r))) sol={bestsum,bestst,bestdr};
    return sol;
}
int main()
{
    fin >>n;
    for (int i=1;i<=n;i++)
        {fin >>a[i];}
    ssm answer=solve(a,1,n);
    fout <<answer.sum<<' '<<answer.l<<' '<<answer.r;
    return 0;
}