#include <iostream>
#include <fstream>
#include <algorithm>
#define MAX_SIZE 20000
int main() {
std::ifstream input("scmax.in");
std::ofstream output("scmax.out");
int n, v[MAX_SIZE], dp[MAX_SIZE], pred[MAX_SIZE], pos_dp[MAX_SIZE];
input >> n;
for (int i = 1; i <= n; ++i) {
input >> v[i];
pred[i] = 0;
}
int len = 1;
dp[1] = v[1];
pos_dp[1] = 1;
pred[1] = 0;
for (int i = 2; i <= n; ++i) {
if (v[i] > dp[len]) {
pred[i] = pos_dp[len];
dp[++len] = v[i];
pos_dp[len] = i;
} else {
int l = 1, r = len;
int pos = 0;
while (l <= r) {
int mid = (l + r) / 2;
if (dp[mid] < v[i]) {
pos = mid;
l = mid + 1;
} else {
r = mid - 1;
}
}
pos++;
dp[pos] = v[i];
pos_dp[pos] = i;
pred[i] = (pos > 1) ? pos_dp[pos - 1] : 0;
}
}
int sol[MAX_SIZE];
int k = len;
int idx = pos_dp[len];
while (idx != 0) {
sol[k--] = v[idx];
idx = pred[idx];
}
output << len << '\n';
for (int i = 1; i <= len; ++i)
output << sol[i] << ' ';
return 0;
}