Cod sursa(job #3031195)

Utilizator preda.andreiPreda Andrei preda.andrei Data 18 martie 2023 22:58:06
Problema Subsir crescator maximal Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.25 kb
#include <algorithm>
#include <fstream>
#include <vector>

using namespace std;

#include <iostream>
vector<int> Solve(const vector<int>& vec) {
    vector<int> prev(vec.size(), -1);
    vector<int> tops;

    for (size_t i = 0; i < vec.size(); i += 1) {
        int len = -1;
        for (int pow = 1 << 30; pow > 0; pow >>= 1) {
            int next_len = len + pow;
            if (next_len < (int)tops.size() && vec[tops[next_len]] < vec[i]) {
                len = next_len;
            }
        }
        len += 1;

        if (len > 0 && !tops.empty()) {
            prev[i] = tops[len - 1];
        }

        if (len >= (int)tops.size()) {
            tops.push_back(i);
        } else {
            tops[len] = i;
        }
    }

    int pos = tops.back();
    vector<int> sub;
    while (pos >= 0) {
        sub.push_back(vec[pos]);
        pos = prev[pos];
    }
    reverse(sub.begin(), sub.end());
    return sub;
}

int main() {
    ifstream fin("scmax.in");
    ofstream fout("scmax.out");

    int n;
    fin >> n;

    vector<int> vec(n);
    for (auto& num : vec) {
        fin >> num;
    }

    auto res = Solve(vec);
    fout << res.size() << "\n";
    for (const auto& num : res) {
        fout << num << " ";
    }
    fout << "\n";
    return 0;
}