Cod sursa(job #2913234)

Utilizator ionanghelinaIonut Anghelina ionanghelina Data 13 iulie 2022 13:24:51
Problema Subsecventa de suma maxima Scor 95
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.33 kb
#include<bits/stdc++.h>
using namespace std;

const int maxN = 6000005;
int n,sp[maxN],mp[maxN],maxim = INT_MIN;
int main()
{
    ifstream fin("ssm.in");
    ofstream fout("ssm.out");

    fin>>n;

    /**
        Cea mai mica suma partiala din intervalul [0..0] e sp[0]

    **/

    mp[0] = 0; //indicele celei mai mici sume partiale
    for(int i=1;i<=n;i++)
    {
        int x;
        fin>>x;

        sp[i] = sp[i-1] + x;
        //Pentru minimele partiale o sa retinem indicii
        /**
            mp[i] = min(sp[0],sp[1],...,sp[i])
        **/

        //Daca sp[i] este cea mai mica de pana acum, atunci mp[i] = i, altfel va fi cea de pana acum, adica mp[i-1]

        if(sp[i] < sp[mp[i-1]])
            mp[i] = i;
        else
            mp[i] = mp[i-1];
    }


    int st,dr;
    for(int i=1;i<=n;i++) //capatul din dreapta
    {
        int val = sp[i] - sp[mp[i-1]];
        if(val>maxim)
        {
            maxim = val;
            st = mp[i-1]+1;
            dr = i;
        }
            else
        if(val==maxim)
        {
            if(mp[i-1]+1 < st || (mp[i-1]+1==st && i<dr))
            {
                maxim = val;
                st = mp[i-1]+1;
                dr = i;
            }
        }
    }

    fout<<maxim<<' '<<st<<' '<<dr<<'\n';
    return 0;
}