Cod sursa(job #3357795)

Utilizator TestLicenta123Test Test TestLicenta123 Data 13 iunie 2026 14:59:06
Problema Subsir crescator maximal Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.39 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <algorithm>

int main() {
    std::ifstream input("scmax.in");
    std::ofstream output("scmax.out");

    int n;
    input >> n;

    std::vector<int> v(n);
    for (int i = 0; i < n; ++i) {
        input >> v[i];
    }

    std::vector<int> dp;
    std::vector<int> pos(n);
    std::vector<int> prev(n, -1);

    for (int i = 0; i < n; ++i) {
        auto it = std::lower_bound(dp.begin(), dp.end(), v[i]);
        int index = it - dp.begin();

        if (it == dp.end()) {
            dp.push_back(v[i]);
        } else {
            *it = v[i];
        }

        pos[i] = index;
        if (index > 0) {
            for (int j = i - 1; j >= 0; --j) {
                if (pos[j] == index - 1 && v[j] < v[i]) {
                    prev[i] = j;
                    break;
                }
            }
        }
    }

    int len = dp.size();
    output << len << '\n';

    if (len == 0) {
        input.close();
        output.close();
        return 0;
    }

    std::vector<int> result;
    int current = std::max_element(pos.begin(), pos.end()) - pos.begin();
    while (current != -1) {
        result.push_back(v[current]);
        current = prev[current];
    }

    std::reverse(result.begin(), result.end());
    for (int i = 0; i < len; ++i) {
        output << result[i] << " ";
    }

    input.close();
    output.close();

    return 0;
}