Cod sursa(job #2940583)

Utilizator preda.andreiPreda Andrei preda.andrei Data 15 noiembrie 2022 21:12:19
Problema Subsir crescator maximal Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.18 kb
#include <algorithm>
#include <fstream>
#include <vector>

using namespace std;

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) {
        auto pos = -1;
        for (auto pow = 1 << 30; pow > 0; pow >>= 1) {
            auto next = pos + pow;
            if (next < (int)tops.size() && vec[tops[next]] < vec[i]) {
                pos = next;
            }
        }
        pos += 1;

        if (pos > 0) {
            prev[i] = tops[pos - 1];
        }
        if (pos >= (int)tops.size()) {
            tops.push_back(i);
        } else {
            tops[pos] = i;
        }
    }

    vector<int> res;
    for (int pos = tops.back(); pos != -1; pos = prev[pos]) {
        res.push_back(vec[pos]);
    }
    reverse(res.begin(), res.end());
    return res;
}

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;
}