#include <fstream>
#include <vector>
#include <algorithm>
#include <climits>
using namespace std;
ifstream cin("scmax.in");
ofstream cout("scmax.out");
int n;
vector<int> v, dp, v_idx_for_dp_idx, parent, ans; // cel mai mic nr din v cu care se termina un subsir de lungime l
int main() {
cin >> n;
v.resize(n + 2);
v_idx_for_dp_idx.resize(n + 2, -1);
parent.resize(n + 2, -1);
dp.assign(n + 2, INT_MAX);
for (int i = 1; i <= n ; ++i) {
cin >> v[i];
}
dp[0] = INT_MIN;
for (int i = 1 ; i <= n ; ++i) {
int target_idx = upper_bound(dp.begin(), dp.end(), v[i]) - dp.begin();
if (v[i] < dp[target_idx] && v[i] > dp[target_idx - 1]) {
dp[target_idx] = v[i];
v_idx_for_dp_idx[target_idx] = i;
if (target_idx > 0) parent[i] = v_idx_for_dp_idx[target_idx - 1];
}
}
int backwards_start = 0;
for (int i = n ; i >= 1 ; --i) {
if (dp[i] != INT_MAX) {
cout << i << "\n";
backwards_start = v_idx_for_dp_idx[i];
break;
}
}
for (int i = backwards_start ; i != -1 ; i = parent[i]) {
ans.push_back(v[i]);
}
reverse(ans.begin(), ans.end());
for (int elem : ans) {
cout << elem << " ";
}
return 0;
}