#include <bits/stdc++.h>
using namespace std;
#define f first
#define s second
ifstream fin( "scmax.in" );
ofstream fout( "scmax.out" );
pair<int,int> v[100010];
int i,j,n,m,parinte[100010],lungime[100010],arb[400010],init[100010],ans;
void update( int nod, int left, int right, int poz, int val )
{
int middle = ( left + right ) / 2;
if( left == right )
{
arb[ nod ] = val;
return;
}
if( poz <= middle )
update( 2 * nod , left , middle , poz , val );
else
update( 2 * nod + 1 , middle + 1 , right , poz , val );
if( lungime[ arb[ 2 * nod ] ] > lungime[ arb[ 2 * nod + 1 ] ] )
arb[ nod ] = arb[ 2 * nod ];
else
arb[ nod ] = arb[ 2 * nod + 1 ];
}
void query( int nod, int left, int right, int L, int R )
{
int middle = ( left + right ) / 2;
if( right < L || left > R )
return;
if( L <= left && right <= R )
{
if( lungime[ arb[ nod ] ] > lungime[ ans ] )
ans = arb[ nod ];
return;
}
query( 2 * nod , left , middle , L , R );
query( 2 * nod + 1 , middle + 1 , right , L , R );
}
void solve( int x )
{
if( x == 0 )
return;
solve( parinte[ x ] );
fout<<init[ x ]<<' ';
}
int main()
{
fin>>n;
for( i = 1 ; i <= n ; i++ )
{
fin>>v[ i ].f;
v[ i ].s = -i;
init[ i ] = v[ i ].f;
}
sort( v + 1 , v + n + 1 );
for( i = 1 ; i <= n ; i++ )
{
ans = 0;
query( 1 , 1 , n , 1 , -v[ i ].s );
parinte[ -v[ i ].s ] = ans;
lungime[ -v[ i ].s ] = lungime[ ans ] + 1;
update( 1 , 1 , n , -v[ i ].s , -v[ i ].s );
}
for( i = 1 ; i <= n ; i++ )
if( lungime[ i ] > lungime[ ans ] )
ans = i;
fout<<lungime[ ans ]<<'\n';
solve( ans );
return 0;
}