#include <fstream>
#include <algorithm>
using namespace std;
ifstream fin( "scmax.in" );
ofstream fout( "scmax.out" );
const int MaxN = 100001;
struct seg {
int d, src;
};
seg tree[4 * MaxN];
int v[MaxN], ind[MaxN], k[MaxN], sol[MaxN];
static inline int lSon( int node ) {
return (node << 1);
}
static inline int rSon( int node ) {
return (node << 1) + 1;
}
void update( int node, int st, int dr, int i, int val, int s ) {
int mij = (st + dr) / 2;
if ( st == dr ) {
tree[node].d = val;
tree[node].src = s;
return;
}
if ( i <= mij ) {
update( lSon( node ), st, mij, i, val, s );
} else {
update( rSon( node ), mij + 1, dr, i, val, s );
}
if ( tree[lSon( node )].d > tree[rSon( node )].d ) {
tree[node].d = tree[lSon( node )].d;
tree[node].src = tree[lSon( node )].src;
} else {
tree[node].d = tree[rSon( node )].d;
tree[node].src = tree[rSon( node )].src;
}
}
int qi;
int query( int node, int st, int dr, int x, int y ) {
int l = 0, r = 0, mij = (st + dr) / 2;
if ( x <= st && dr <= y ) {
return tree[node].d;
}
if ( x <= mij ) {
l = query( lSon( node ), st, mij, x, y );
}
if ( y > mij ) {
r = query( rSon( node ), mij + 1, dr, x, y );
}
if ( l > r ) {
qi = tree[lSon( node )].src;
return l;
} else {
qi = tree[rSon( node )].src;
return r;
}
}
int cmp( int a, int b ) {
return v[a] < v[b];
}
int main() {
int n, i, nr, st, dr, node, j;
fin >> n;
for ( i = 1; i <= n; ++i ) {
fin >> v[i];
ind[i] = i;
}
sort( ind + 1, ind + n + 1, cmp );
for ( i = 1; i <= n; ++i ) {
qi = 0;
nr = query( 1, 1, n, 1, ind[i] ) + 1;
k[ind[i]] = tree[1].src;
update( 1, 1, n, ind[i], nr, ind[i] );
//printf( " %d\n", tree[1].src );
//printf( " %d %d\n", tree[2].src, tree[3].src );
//printf( " %d %d %d %d\n", tree[4].src, tree[5].src, tree[6].src, tree[7].src );
//printf( " %d %d\n", tree[8].src, tree[9].src );
//printf( "\n\n" );
}
/*for ( i = 1; i <= n; ++i ) {
//printf( "%d %d\n", k[ind[i]], v[ind[i]] );
}*/
fout << tree[1].d << "\n";
i = tree[1].src;
j = 0;
while ( i != 0 ) {
sol[j++] = v[i];
i = k[i];
}
for ( i = tree[1].d - 1; i >= 0; --i ) {
fout << sol[i] << " ";
}
fin.close();
fout.close();
return 0;
}