Cod sursa(job #2273395)

Utilizator TooHappyMarchitan Teodor TooHappy Data 31 octombrie 2018 14:59:13
Problema Subsecventa de suma maxima Scor 55
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.39 kb
#include <bits/stdc++.h>
using namespace std;

ifstream in("ssm.in");
ofstream out("ssm.out");

const int minusInf = -1e9;

vector< int > v;
int sol = minusInf, st, dr;

void ssm(int left, int right) {
    if(left == right) {
        sol = v[left];
        st = left; dr = right;
        return;
    }

    int mid = (left + right) / 2;
    ssm(left, mid);
    ssm(mid + 1, right);

    int r1 = minusInf, lIdx = mid, sLeft = 0;
    for(int p = mid; p >= left; --p) {
        sLeft += v[p];
        if(sLeft > r1) {
            r1 = sLeft;
            lIdx = p;
        }
    }

    int r2 = minusInf, rIdx = mid + 1, sRight = 0;
    for(int p = mid + 1; p <= right; ++p) {
        sRight += v[p];
        if(sRight > r2) {
            r2 = sRight;
            rIdx = p;
        }
    }

    if(r1 + r2 > sol) {
        sol = r1 + r2;
        st = lIdx; dr = rIdx;
    } else {
        if(r1 + r2 == sol) {
            if(lIdx < st) {
                st = lIdx;
            } else {
                if(lIdx == st) {
                    if(rIdx < dr) {
                        dr = rIdx;
                    }
                }
            }
        }
    }
}

int main() {
    ios::sync_with_stdio(false); in.tie(0); out.tie(0);

    int n; in >> n;

    v.resize(n);
    for(auto &x: v) in >> x;

    ssm(0, n - 1);

    out << sol << " " << st + 1 << " " << dr + 1 << "\n";

    in.close(); out.close();

    return 0;
}