#include <fstream>
#include <algorithm>
using namespace std;
ifstream fin("scmax.in");
ofstream fout("scmax.out");
#define DIM 100010
#define f first
#define s second
int v[DIM],sol[DIM],i,j,n,m,l,lun,st,p;
pair<int,int>norm[DIM];
pair<int,int>arb[4*DIM];
void query( int nod, int left, int right, int lim, int &lung, int &poz )
{
int middle = ( left + right ) / 2;
if( left > lim )
return;
if( right <= lim )
{
if( arb[ nod ].f > lung )
{
lung = arb[ nod ].f;
poz = arb[ nod ].s;
}
return;
}
query( 2 * nod , left , middle , lim , lung , poz );
if( lim > middle )
query( 2 * nod + 1 , middle + 1 , right , lim , lung , poz );
}
void update( int nod, int left, int right, int poz, int valA, int valB )
{
int middle = ( left + right ) / 2;
if( left == right )
{
arb[ nod ].f = valA;
arb[ nod ].s = valB;
return;
}
if( poz <= middle )
update( 2 * nod , left , middle , poz , valA , valB );
else
update( 2 * nod + 1 , middle + 1 , right , poz , valA , valB );
if( arb[ 2 * nod ].f > arb[ 2 * nod + 1 ].f )
arb[ nod ] = arb[ 2 * nod ];
else
arb[ nod ] = arb[ 2 * nod + 1 ];
}
bool cmp( pair<int,int>a, pair<int,int>b )
{
if( a.f<b.f )
return true;
else if( a.f>b.f )
return false;
else
return a.s>b.s;
}
int main()
{
fin>>n;
for( i = 1 ; i <= n ; i++ )
{
fin>>v[ i ];
norm[ i ] = make_pair( v[ i ] , i );
}
sort( norm + 1 , norm + n + 1 , cmp );
for( i = 1 ; i <= n ; i++ )
{
l = p = 0;
query( 1 , 1 , n , norm[ i ].s - 1 , l , p );
l++;
sol[ norm[ i ].s ] = norm[ p ].s;
if( l >= lun )
st = norm[i].s,lun = l;
update( 1 , 1 , n , norm[ i ].s , l , i );
}
l = lun;
while( st != 0 )
{
norm[ l-- ].f = v[ st ];
st = sol[ st ];
}
fout<<lun<<'\n';
for( i = 1 ; i <= lun ; i++ )
fout<<norm[ i ].f<<' ';
return 0;
}