#include <fstream>
#include <map>
#define nm 100001
using namespace std;
ifstream fin("scmax.in");
ofstream fout("scmax.out");
map<unsigned, unsigned> M;
unsigned E[nm];
unsigned P[nm];
unsigned T[nm * 4];
inline unsigned maxf(unsigned a, unsigned b) {
return (a > b? a: b);
}
void _update(unsigned n, unsigned v, unsigned l, unsigned r, unsigned k) {
if (l > r) {
return;
} else if (v <= l) {
T[n] = maxf(k, T[n]);
} else {
unsigned m = (l + r) >> 1;
if (v <= m) {
_update(n << 1, v, l, m, k);
}
if (1) {
_update(n << 1 | 1, v, m + 1, r, k);
}
}
}
unsigned _query(unsigned n, unsigned v, unsigned l, unsigned r) {
if (l > r) {
return 0;
} else if (v <= l || l == r) {
return T[n];
} else {
unsigned 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));
}
}
}
void back(unsigned 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() {
unsigned N, i, l, v, k, p, maxe, pmax;
map<unsigned, unsigned>::iterator j;
fin >> N;
// populate structures
for (i = 1, maxe = 0; i <= N; ++i) {
fin >> v;
E[i] = v;
M.insert(pair<unsigned, unsigned>(v, 0));
}
// create positions
for (j = M.begin(), i = 1; j != M.end(); ++j, ++i) {
j->second = i;
}
// update
for (l = 1; l <= N; ++l) {
// get this position
k = M.find(E[l])->second;
// get pair
p = _query(1, k, 1, i - 1);
// update this length
_update(1, k + 1, 1, i - 1, P[l] = 1 + p);
if (P[l] > maxe) {
maxe = P[l];
pmax = l;
}
}
fout << maxe << '\n';
back(pmax);
fin.close();
fout.close();
return 0;
}