Pagini recente » Cod sursa (job #2296973) | Cod sursa (job #493969) | Cod sursa (job #1737299) | Cod sursa (job #1562289) | Cod sursa (job #1120848)
#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] << ' ';
}
}