Cod sursa(job #1604218)

Utilizator NicholasFlamelFasie Vlad George NicholasFlamel Data 18 februarie 2016 02:25:27
Problema Subsecventa de suma maxima Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.36 kb
#include <iostream>
#include <stdio.h>

using namespace std;

const int MIN = 0x80000000;

void divide(int *v, int low, int up, int &start, int &stop, int &s) {
    if(low == up) {
        if(v[low] > s) {
            s = v[low];
            start = stop = low;
        }
        return;
    }
    int mij = (low + up) / 2;
    divide(v, low, mij, start, stop, s);
    divide(v, mij+1, up, start, stop, s);
    int l = MIN, r = MIN;
    int sl = 0, sr = 0;
    int left, right;
    for(int i = mij; i >= low; i--) {
        sl += v[i];
        if(sl > l) {
            l = sl;
            left = i;
        }
    }
    for(int i = mij + 1; i <= up; i++) {
        sr += v[i];
        if(sr > r) {
            r = sr;
            right = i;
        }
    }
    if(r + l > s) {
        s = r + l;
        start = left;
        stop = right;
    }
}

int main()
{
    FILE *f;
    int n;
    if( (f = fopen("ssm.in", "r")) == NULL) {
        return 0;
    }
    fscanf(f, "%d", &n);
    int *v;
    v = new int[n];
    for(int i = 0; i < n; i++) {
        fscanf(f, "%d", &v[i]);
    }
    int b, e, s = MIN;
    divide(v, 0, n-1, b, e, s);
    b++;
    e++;
    fclose(f);
    if( (f = fopen("ssm.out", "w")) == NULL) {
        return 0;
    }
    fprintf(f, "%d %d %d", s, b, e);
    fclose(f);
    delete[] v;
    return 0;
}