Cod sursa(job #3239435)

Utilizator filipinezulBrain Crash filipinezul Data 5 august 2024 16:31:34
Problema Subsir crescator maximal Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.61 kb
#include <bits/stdc++.h>
using namespace std;

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

 private:
    int n;
    vector<int32_t> v;
    vector<int32_t> scmax;

    vector<int32_t> pos;
    stack<int32_t> st;

    void read_input() {
        ifstream fin("scmax.in");
        fin.tie(0);
        
        fin >> n;
        v.resize(n);

        pos.resize(n);

        for (int i = 0; i < n; i++) {
            fin >> v[i];
        }

        fin.close();
    }

    void get_result() {
        scmax.push_back(v[0]);
        pos[0] = 0;

        for (int i = 1; i < n; i++) {
            if (scmax.back() < v[i]) {
                pos[i] = scmax.size();
                scmax.push_back(v[i]);
                continue;
            }

            auto it = lower_bound(scmax.begin(), scmax.end(), v[i]);
            int p = it - scmax.begin();

            pos[i] = p;
            scmax[p] = v[i];
        }

        int cp = scmax.size() - 1;
        for (int i = n - 1; i >= 0; i--)
        {
            if (pos[i] == cp) {
                st.push(v[i]);
                cp--;
            }
        }
    }

    void print_output() {
        ofstream fout("scmax.out");
        fout.tie(0);

        fout << scmax.size() << "\n";

        while (!st.empty()) {
            fout << st.top() << " ";
            st.pop();
        }

        fout.close();
    }
};

int main() {
    ios::sync_with_stdio(false);
    auto* task = new (nothrow) Task();

    if (!task) {
        cerr << "new failed\n";
        return -1;
    }

    task->solve();
    delete task;

    return 0;
}