Cod sursa(job #1120848)

Utilizator toranagahVlad Badelita toranagah Data 25 februarie 2014 10:26:37
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1 kb
#include <algorithm>
#include <fstream>
#include <iostream>
#include <vector>
using namespace std;

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

vector<int> lis(const vector<int> &v) {
    vector<int> l;
    vector<int> p(v.size(), 0);
    auto cmp = [&v](int a, int b) {return v[a] < v[b];};

    l.push_back(0);
    for (size_t i = 1; i < v.size(); i += 1) {
        if (v[i] > v[l.back()]) {
            p[i] = l.back();
            l.push_back(i);
            continue;
        }

        size_t pos = lower_bound(l.begin(), l.end(), i, cmp) - l.begin();

        if (pos > 0) p[i] = l[pos - 1];
        l[pos] = i;
    }

    for (int i = l.size() - 1, j = l.back(); i >= 0; i -= 1, j = p[j]) {
        l[i] = v[j];
    }
    return l;
}

int main() {
    size_t n;
    fin >> n;

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

    vector<int> l = lis(v);
    fout << l.size() << '\n';
    for (size_t i = 0; i < l.size(); i += 1) {
        fout << l[i] << ' ';
    }
}