Cod sursa(job #2275898)

Utilizator andrew_assassin789Andrei Manea andrew_assassin789 Data 3 noiembrie 2018 18:49:32
Problema Subsecventa de suma maxima Scor 80
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.65 kb
#include <fstream>
#include <climits>
#define nmax 6000005
using namespace std;
int v[nmax];
int Smax=INT_MIN,stMax=INT_MIN,drMax=INT_MIN;
void divide(int st, int dr)
{
    int mij=(st+dr)/2;
    if (st<dr)
    {
        divide(st,mij);
        divide(mij+1,dr);

        int stmax,drmax,sum=0,i,st_suMax,dr_suMax;
        st_suMax=INT_MIN;
        sum=0;
        for (i=mij;i>=st;i--)
        {
            sum+=v[i];
            if (sum>st_suMax)
            {
                st_suMax=sum;
                stmax=i;
            }
        }
        dr_suMax=INT_MIN;
        sum=0;
        for (i=mij+1;i<=dr;i++)
        {
            sum+=v[i];
            if (sum>dr_suMax)
            {
                dr_suMax=sum;
                drmax=i;
            }
        }
        if (st_suMax+dr_suMax==Smax)
        {
            if (stMax==stmax)
            {
                if (drMax>drmax)
                {
                    stMax=stmax;
                    drMax=drmax;
                }
            }
            else
                if (stMax>stmax)
                {
                    stMax=stmax;
                    drMax=drmax;
                }
        }
        else
            if (st_suMax+dr_suMax>Smax)
            {
                Smax=st_suMax+dr_suMax;
                stMax=stmax;
                drMax=drmax;
            }
    }
}
int main()
{
    ifstream fin("ssm.in");
    ofstream fout("ssm.out");
    int n,i;
    fin>>n;
    for (i=1;i<=n;i++)
        fin>>v[i];
    divide(1,n);
    fout<<Smax<<' '<<stMax<<' '<<drMax<<'\n';
    fin.close();
    fout.close();
    return 0;
}