Cod sursa(job #2274144)

Utilizator gundorfMoldovan George gundorf Data 1 noiembrie 2018 14:23:28
Problema Subsecventa de suma maxima Scor 60
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.61 kb
#include <iostream>
#include <fstream>
#define Nmax 6000005
using namespace std;
ifstream fin("ssm.in");
ofstream fout("ssm.out");
int v[Nmax];
struct returnare
{
    int valoare, stanga,dreapta;
};

returnare divide (int left,int right)
{
    if (left==right) {returnare r; r.valoare=v[left];r.stanga=r.dreapta=left; return r;}

    int mid=(left+right)/2;

    returnare r1=divide (left,mid);
    returnare r2=divide (mid+1,right);
    int maxim_Stanga=0,maxim_Dreapta=0;
    int sumaP1=0,sumaP2;
    int pozStanga,pozDreapta;
    for (int i=mid;i>=left;i--)
    {
        sumaP2=sumaP1+v[i];
        if (sumaP2>maxim_Stanga) {maxim_Stanga=sumaP2;pozStanga=i;}
        sumaP1=sumaP2;
    }
    sumaP1=0;
    for (int i=mid+1;i<=right;i++)
    {
        sumaP2=sumaP1+v[i];
         if (sumaP2>maxim_Dreapta) {maxim_Dreapta=sumaP2;pozDreapta=i;}
         sumaP1=sumaP2;
    }
    returnare r3;
     r3.valoare=maxim_Dreapta+maxim_Stanga;
     r3.stanga=pozStanga;
     r3.dreapta=pozDreapta;
    if (r1.valoare>r3.valoare) r3=r1;
    if(r2.valoare>r3.valoare) r3=r2;
    if (r2.valoare==r3.valoare&&r2.stanga<r3.stanga) r3=r2;
     if (r1.valoare==r3.valoare&&r1.stanga<r3.stanga) r3=r1;
      if (r2.valoare==r3.valoare&&r2.stanga==r3.stanga&&r2.dreapta-r2.stanga<r3.dreapta-r3.stanga) r3=r2;
        if (r1.valoare==r3.valoare&&r1.stanga==r3.stanga&&r1.dreapta-r1.stanga<r3.dreapta-r3.stanga) r3=r1;
    return r3;
}
int main()
{int n;
    fin>>n;
    for (int i=1;i<=n;i++)
        fin>>v[i];
    returnare r=divide(1,n);
    fout<<r.valoare<<" "<<r.stanga<<" "<<r.dreapta;
    return 0;
}