#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,n,m,j,arb[400010],lungime[100010],precedent[100010],initial[100010],ans;
void update( int nod, int left, int right, int poz, int val )
{
if( left == right )
{
arb[ nod ] = val;
return;
}
int middle = ( left + right ) / 2;
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 )
{
if( right < L || left > R )
return;
if( L <= left && right <= R )
{
if( lungime[ arb[ nod ] ] > lungime[ ans ] )
{
ans = arb[ nod ];
}
return;
}
int middle = ( left + right ) / 2;
query( 2 * nod , left , middle , L , R );
query( 2 * nod + 1 , middle + 1 , right , L , R );
}
void afisare( int x )
{
if( x == 0 )
return;
afisare( precedent[ x ] );
fout<<initial[ x ]<<' ';
}
int main()
{
fin>>n;
for( i = 1 ; i <= n ; i++ )
{
fin>>v[ i ].f;
initial[ i ] = v[ i ].f;
v[ i ].s = -i;
}
sort( v + 1 , v + n + 1 );
for( i = 1 ; i <= n ; i++ )
{
v[ i ].s *= -1;
}
for( i = 1 ; i <= n ; i++ )
{
ans = 0;
query( 1 , 1 , n , 1 , v[ i ].s );
precedent[ v[ i ].s ] = ans;
lungime[ v[ i ].s ] = lungime[ ans ] + 1;
update( 1 , 1 , n , v[ i ].s , v[ i ].s );
}
ans = 1;
for( i = 1 ; i <= n ; i++ )
{
if( lungime[ i ] > lungime[ ans ] )
ans = i;
}
fout<<lungime[ ans ]<<'\n';
afisare( ans );
return 0;
}