Cod sursa(job #1460650)

Utilizator bogdan10bosBogdan Sitaru bogdan10bos Data 13 iulie 2015 14:05:01
Problema Subsecventa de suma maxima Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.47 kb
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <ctime>
#include <cmath>
#include <algorithm>
#include <vector>
#include <queue>
#include <deque>

#define INF ( (1 << 30) - 1 + (1 << 30) )
#define mod 666013

using namespace std;

struct rez
{
    int s, st, dr;
}r;

int n, i, v[6000005];

rez subsecventa(int st, int mij, int dr)
{
    rez r;
    int sts, drs; sts = drs = -INF;
    int i;
    int s = 0;
    for(i = mij; i >= st; i--)
    {
        s += v[i];
        if(s > sts)
        {
            sts = s;
            r.st = i;
        }
    }
    s = 0;
    for(i = mij + 1; i <= dr; i++)
    {
        s += v[i];
        if(s > drs)
        {
            drs = s;
            r.dr = i;
        }
    }
    r.s = sts + drs;
    return r;
}

rez subsecventa(int st, int dr)
{
    rez r, r1, r2, r3;

    if(st == dr)
    {
        r.s = v[st];
        r.st = r.dr = st;
        return r;
    }

    int mij = st + ( (dr - st) >> 1 );
    r1 = subsecventa(st, mij);
    r2 = subsecventa(mij + 1, dr);
    r3 = subsecventa(st, mij, dr);

    if(r1.s > r2.s && r1.s > r3.s)
        return r1;
    if(r2.s > r3.s)
        return r2;
    return r3;
}

int main()
{
    freopen("ssm.in", "r", stdin);
    freopen("ssm.out", "w", stdout);

    scanf("%d", &n);
    for(i = 1; i <= n; i++)
        scanf("%d", &v[i]);
    r = subsecventa(1, n);
    printf("%d %d %d", r.s, r.st, r.dr);

    return 0;
}