Cod sursa(job #2274903)

Utilizator rebeca98Tataru Rebeca rebeca98 Data 2 noiembrie 2018 17:26:48
Problema Subsecventa de suma maxima Scor 45
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.71 kb
#include <iostream>
#include<stdio.h>
#include <fstream>
using namespace std;

#define INF 1000000006

int n, v[100006];
int ans=-INF, lleft, rright;

void divide(int st, int dr) {
    if(st >= dr) {
        // v[st]
        if(v[st] > ans) {
            ans = v[st];
            lleft = st;
            rright = st;
        }
        else if(v[st] == ans) {
            if(st < lleft) {
                lleft = rright = st;
            }
            else if(st == lleft) {
                rright = st;
            }
        }
        return ;
    }

    int m,s_st = -INF, p_st = 0, s_dr = -INF, p_dr = 0, i, s=0;
    m = (st + dr) / 2;
    divide(st, m);
    divide(m + 1, dr);

    for(i=m;i>=st;i--) {
        s = s + v[i];
        if(s >= s_st) {
            s_st = s;
            p_st = i;
        }
    }
    s=0;
    for(i=m+1;i<=dr;i++) {
        s = s + v[i];
        if(s > s_dr) {
            s_dr = s;
            p_dr = i;
        }
    }

   // printf("%d %d (%d %d) (%d %d)\n", st, dr, s_st, p_st, s_dr, p_dr);

    if(s_st + s_dr > ans) {
        ans = s_st + s_dr;
        lleft = p_st;
        rright = p_dr;
    }
    else if(s_st + s_dr == ans) {
        if(p_st < lleft) {
            lleft = p_st;
            rright = p_dr;
        }
        else if(p_st == lleft && p_dr < rright) {
            rright = p_dr;
        }
    }
}
int main()
{
    int i;
    ifstream f("ssm.in");
    f>>n;

    for(i=0;i<n;i++) {
      f>>v[i];
      //cout << v[i];
    }

    divide(0,n-1);

    cout << ans << " " << lleft + 1 << " " << rright + 1 << "\n";
    ofstream g("ssm.out");
    g<<ans<<" "<<lleft +1<<" "<<rright + 1<<"\n";

    return 0;
}