Cod sursa(job #2273391)

Utilizator biaiftimeIftime Bianca biaiftime Data 31 octombrie 2018 14:55:01
Problema Subsecventa de suma maxima Scor 75
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.55 kb
#include <bits/stdc++.h>

using namespace std;
ifstream fin("ssm.in");
ofstream fout("ssm.out");
vector <int> v;
int n;
long long sol;
int left_1,right_1;
void Citire()
{
    int i,x;
    fin>>n;
    v.push_back(0);
    for(i=1;i<=n;++i)
    {
        fin>>x;
        v.push_back(x);
    }
}
void  Divide(int left,int right)
{
    if(left<right)
    {
        int mid=(left+right)/2;
        Divide(left,mid);
        Divide(mid+1,right);
        long long nr_max1=v[mid];
        long long nr_max2=v[mid+1];
        long long s1=0,s2=0;
        int ind1=mid,ind2=mid+1;
        for(int i=mid;i>=left;i--)
            {
                s1+=v[i];
                 if(nr_max1<=s1){nr_max1=s1; ind1=i;}
            }
        for(int i=mid+1;i<=right;++i)
        {
            s2+=v[i];
            if(nr_max2<s2){nr_max2=s2; ind2=i;}
        }
        if(nr_max1+nr_max2>sol)
        {
            sol=nr_max1+nr_max2;
            left_1=ind1;
            right_1=ind2;
        }
        else if(nr_max1+nr_max2==sol)
        {
            if(ind1<left_1)
            {
                left_1=ind1;
               right_1=ind2;
            }
            else if(left_1==ind1&&right_1-left_1>ind1+ind2)
            {
                left_1=ind1;
                right_1=ind2;
            }
        }
    }
    else if(left==right&&sol<v[left])
    {
        sol=v[left];
        left_1=right_1=left;
    }

}
int main()
{
    Citire();
    Divide(1,n);
    fout<<sol<<" "<<left_1<<" "<<right_1<<"\n";
    return 0;
}