Cod sursa(job #1809089)

Utilizator Al3ks1002Alex Cociorva Al3ks1002 Data 18 noiembrie 2016 17:32:27
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.44 kb
#include <stdio.h>
#include <bits/stdc++.h>

using namespace std;

template<class T>
class LIS {
    public:
        LIS(const vector<T>& array) : array_(array) {}

        vector<T> FindLIS() {
            vector<T> v;
            vector<int> where(array_.size());
            int answer = 0;
            for (int i = 0; i < array_.size(); i++) {
                v.push_back(numeric_limits<T>::max());
                int position = lower_bound(v.begin(), v.end(), array_[i]) - v.begin();
                v[position] = array_[i];
                where[i] = position;
                answer = max(answer, position);
            }

            int current = answer;
            vector<int> actual_answer;
            for (int i = (int)array_.size() - 1; i >= 0; i--) {
                if (where[i] == current) {
                    actual_answer.push_back(array_[i]);
                    current--;
                }
            }

            reverse(actual_answer.begin(), actual_answer.end());
            return actual_answer;
        }

    private:
        vector<T> array_;
};

int main() {
    cin.sync_with_stdio(false);

    ifstream cin("scmax.in");
    ofstream cout("scmax.out");

    int n;
    cin >> n;

    vector<int> a(n);
    for (int i = 0; i < n; i++) {
        cin >> a[i];
    }

    LIS<int> lis(a);
    vector<int> answer = lis.FindLIS();

    cout << answer.size() << '\n';
    for (auto it : answer) {
        cout << it << " ";
    }

    return 0;
}