#include <fstream>
#include <algorithm>
#include <hash_map>
#define nm 131072
using namespace std;
ifstream fin("scmax.in");
ofstream fout("scmax.out");
int E[nm], F[nm], P[nm], T[nm * 4];
hash_map<int, int> M;
inline int maxf(int a, int b) {
return (a > b? a: b);
}
void update(int n, int v, int l, int r, int k) {
if (v <= l) {
T[n] = maxf(k, T[n]);
} else {
int m = (l + r) >> 1;
if (v <= m) {
update(n << 1, v, l, m, k);
}
update(n << 1 | 1, v, m + 1, r, k);
}
}
int query(int n, int v, int l, int r) {
if (v <= l) {
return T[n];
} else {
int m = (l + r) >> 1;
if (v <= m) {
return maxf(T[n], query(n << 1, v, l, m));
} else {
return maxf(T[n], query(n << 1 | 1, v, m + 1, r));
}
}
return 1;
}
void back(int p) {
if (p > 0) {
int i;
for (i = p - 1; i > 0 && !(E[i] < E[p] && P[i] + 1 == P[p]); --i);
back(i);
fout << E[p] << ' ';
}
}
int main() {
int N, i, l, v, k, p, maxe, pmax;
fin >> N;
// populate structures
for (i = 1, maxe = 0; i <= N; ++i) {
fin >> v;
E[i] = F[i] = v;
}
// sort data
sort(F + 1, F + N + 1);
// create positions
for (i = 1; i <= N; ++i) {
M[F[i]] = i;
}
// update
for (--i, l = 1; l <= N; ++l) {
// get this position
k = M[E[l]];
// get pair
p = query(1, k, 1, i);
// update this length
update(1, k + 1, 1, i, P[l] = 1 + p);
if (P[l] > maxe) {
maxe = P[l];
pmax = l;
}
}
fout << maxe << '\n';
back(pmax);
fin.close();
fout.close();
return 0;
}