Cod sursa(job #2273400)

Utilizator TooHappyMarchitan Teodor TooHappy Data 31 octombrie 2018 15:07:27
Problema Subsecventa de suma maxima Scor 70
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, 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;
}