Cod sursa(job #3344048)

Utilizator Dddarius95Darius-Florentin Neatu Dddarius95 Data 1 martie 2026 11:06:53
Problema Subsecventa de suma maxima Scor 75
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.89 kb
// SPDX-License-Identifier: BSD-3-Clause

#include <fstream> // ifstream, ofstream
#include <iostream> // cin, cout, cerr
#include <memory> // unique_ptr pentru Task
#include <vector> // vector
using namespace std;

class Task {
public:
    void solve() {
        read_input();
        write_output(get_result());
    }

private:
    int n;
    vector<int> v;
    int start_pos, end_pos;

    void read_input() {
        ifstream fin("ssm.in");
        // citeste datele
        fin >> n;
        v.resize(n); // redimensioneaza v sa aiba n elememnte
        for (int i = 0; i < n; ++i) {
            fin >> v[i];
        }
        fin.close();
    }

    int get_result() {
        vector<int> dp(n); // vector cu n elemente
        vector<int> start(n);

        // caz de baza
        dp[0] = v[0];
        start[0] = 0;

        // caz general
        for (int i = 1; i < n; ++i) {
            if (dp[i - 1] >= 0) {
                // extinde la dreapta cu v[i]
                dp[i] = dp[i - 1] + v[i];
                start[i] = start[i - 1];
            } else {
                // incep o noua secventa
                dp[i] = v[i];
                start[i] = i;
            }
        }

        // solutia e maximul din vectorul dp
        int sol = dp[0], pos = 0;
        for (int i = 1; i < n; ++i) {
            if (dp[i] > sol) {
                sol = dp[i];
                pos = i;
            }
        }
        start_pos = start[pos];
        end_pos = pos;
        return sol;
    }

    void write_output(int result) {
        ofstream fout("ssm.out");
        fout << result << " " << start_pos + 1 << " " << end_pos + 1 << "\n";
        fout.close();
    }
};

// [ATENTIE] NU modifica functia main!
int main() {
    std::unique_ptr<Task> task {new (nothrow) Task()};
    if (!task) {
        std::cerr << "new failed: WTF are you doing? Throw your PC!\n";
        return -1;
    }
    task->solve();
    return 0;
}