#include <cstdio>
#include <algorithm>
#define maxn 100050
#define mid ((st + dr) >> 1)
#define fs (mid << 1)
#define fd ((mid<<1)+1)
using namespace std;
int D[maxn], lst[maxn], h, res, ind, A[maxn], B[maxn], up[maxn], k, N, arb[4 * maxn], sol[4 * maxn];
void update (int nod, int st, int dr, int val, int nr, int poz)
{
if (st == dr) {
if (arb[nod] < nr) {
arb[nod] = nr;
sol[nod] = poz;
}
return ;
}
if (val <= mid)
update (fs, st, mid, val, nr, poz);
if (val > mid)
update (fd, mid + 1, dr, val, nr, poz);
if (arb[fs] > arb[fd]) sol[nod] = sol[fs];
else sol[nod] = sol[fd];
arb[nod] = max (arb[fs], arb[fd]);
}
void query (int nod, int st, int dr, int b)
{
if (b >= dr || st == dr) {
if (res < arb[nod]) {
res = arb[nod];
ind = sol[nod];
}
return ;
}
query (fs, st, mid, b);
if (b > mid) query (fd, mid + 1, dr, b);
}
int main ()
{
freopen ("scmax.in", "r", stdin);
freopen ("scmax.out", "w", stdout);
scanf ("%d\n", &N);
int i, ord;
for (i = 1; i <= N; i++)
{
scanf ("%d", &A[i]);
B[i] = A[i];
}
sort (A + 1, A + N + 1);
k = unique (A + 1, A + N + 1) - A;
k -= 1;
for (i = 1; i <= N; i++) {
ord = lower_bound (A + 1, A + k + 1, B[i]) - A;
res = 0;
ind = 0;
// printf ("%d\n", ord);
query (1, 1, k, ord - 1);
D[i] = res + 1;
up[i] = ind;
update (1, 1, k, ord, D[i], i);
}
int mx, pz = 1;
mx = 0;
for (i = 1; i <= N; i++)
if (mx < D[i])
mx = D[i], pz = i;
printf ("%d\n", mx);
for (i = pz; i; i = up[i])
lst[++h] = B[i];
for (; h >= 2; h--)
printf ("%d ", lst[h]);
printf ("%d\n", lst[1]);
return 0;
}