#include <fstream>
#include <vector>
#include <algorithm>
#include <climits>
using namespace std;
ifstream cin("scmax.in");
ofstream cout("scmax.out");
vector<int> v, d, indice, parent;
int n;
int main() {
cin >> n;
v.resize(n + 2);
parent.resize(n + 2, -1);
d.resize(n + 2, INT_MAX);
indice.resize(n + 2, -1);
for (int i = 1 ; i <= n ; ++i) {
cin >> v[i];
}
d[0] = INT_MIN;
for (int i = 1 ; i <= n ; ++i) {
int j = upper_bound(d.begin(), d.end(), v[i]) - d.begin();
if (v[i] < d[j] && v[i] > d[j - 1]) {
d[j] = v[i];
indice[j] = i;
if (j > 0) parent[i] = indice[j - 1];
}
}
int max_len, poz;
for (int i = n ; i >= 1 ; --i) {
if (d[i] != INT_MAX) {
cout << i << "\n";
poz = indice[i];
break;
}
}
vector<int> ans;
for (int i = poz ; i != -1 ; i = parent[i]) {
ans.push_back(v[i]);
}
reverse(ans.begin(), ans.end());
for (int elem : ans) {
cout << elem << " ";
}
return 0;
}