Cod sursa(job #2274872)

Utilizator rebeca98Tataru Rebeca rebeca98 Data 2 noiembrie 2018 16:54:39
Problema Subsecventa de suma maxima Scor 35
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.27 kb
#include <iostream>
#include<stdio.h>
#include <fstream>
using namespace std;

#define INF 1000000006

int n, v[100006];
int ans, lleft, rright;

void divide(int st, int dr) {
    if(st >= dr) {
        // v[st]
        if(v[st] > ans) {
            ans = v[st];
            lleft = st;
            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;
    }
}
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;
}