#include <cstdio>
#define DIM 100005
int n, v[DIM], p[DIM], q[DIM], L;
void citire()
{
FILE *f = fopen("scmax.in", "r");
fscanf(f, "%d", &n);
for (int i = 1; i <= n; ++i)
fscanf(f, "%d", &v[i]);
fclose(f);
}
int caut(int z[], int x, int st, int dr)
{
if (dr <= st)
{
if (dr == st && z[st] >= x)
return st;
return -1;
}
int m = st + (dr - st)/2;
if (z[m] >= x)
return caut(z, x, st, m);
else
return caut(z, x, m + 1, dr);
}
void solve()
{
for (int i = 1, poz; i <= n; ++i)
{
poz = caut(q, v[i], 1, L);
if (poz != -1)
q[poz] = v[i], p[i] = poz;
else
q[++L] = v[i], p[i] = L;
}
}
void afisare(FILE *f, int i, int l)
{
if (!l)
return;
if (p[i] != l)
afisare(f, i-1, l);
else
afisare(f, i-1, l-1), fprintf(f, "%d ", v[i]) ;
}
int main()
{
citire();
solve();
FILE *f = fopen("scmax.out", "w");
fprintf (f, "%d\n", L);
afisare(f, n, L);
fclose(f);
return 0;
}