Cod sursa(job #2797871)

Utilizator chiriacandrei25Chiriac Andrei chiriacandrei25 Data 10 noiembrie 2021 18:18:26
Problema Subsecventa de suma maxima Scor 65
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.55 kb
#include <fstream>
#include <climits>

using namespace std;

const int Nmax = 6000005;

struct Ssm {
    int sum, left, right;
};

int n, a[Nmax];

Ssm solve(int a[], int left, int right) {
    
    if(left == right) {
        return {a[left], left, right};
    }
    
    int middle = (left + right) / 2;

    Ssm ssmLeft = solve(a, left, middle);
    Ssm ssmRight = solve(a, middle + 1, right);

    int sum = 0, maxSum = -INT_MAX, bestSt, bestDr;
    for(int st = middle; st >= left; st--) {
        sum += a[st];
        if(sum > maxSum) {
            maxSum = sum;
            bestSt = st;
        }
    }

    int bestSum = maxSum;

    sum = 0; maxSum = -INT_MAX;
    for(int dr = middle + 1; dr <= right; dr++) {
        sum += a[dr];
        if(sum > maxSum) {
            maxSum = sum;
            bestDr = dr;
        }
    }    

    bestSum += maxSum;

    Ssm sol;
    if(ssmLeft.sum >= ssmRight.sum) {
        sol = ssmLeft;
    }
    else {
        sol = ssmRight;
    }

    if(bestSum > sol.sum) {
        sol = {bestSum, bestSt, bestDr};
    }
    else if(bestSum == sol.sum && (bestSt < sol.left || (bestSt == sol.left && bestDr < sol.right))) {
        sol = {bestSum, bestSt, bestDr};
    }

    return sol;
}

int main() {
    ifstream fin("ssm.in");
    ofstream fout("ssm.out");

    fin >> n;
    for(int i = 1; i <= n; i++) {
        fin >> a[i];
    }

    Ssm answer = solve(a, 1, n);

    fout << answer.sum << " " << answer.left << " " << answer.right << "\n";

    return 0;

}