#include <fstream>
#include <algorithm>
using namespace std;
ifstream fin("scmax.in");
ofstream fout("scmax.out");
#define f first
#define s second
pair<int,int> v[100001],arb[400000];
int i,j,n,m,sol[100001],lng,lngMax,startPos,pos,ans[1000001];
bool cmp( pair<int,int> a, pair<int,int> b )
{
if( a.f != b.f )
return a.f<b.f;
else
return a.s>b.s;
}
void query( int nod, int left, int right, int ld, int &lung, int &poz )
{
int middle = ( left + right ) / 2;
if( left > middle )
return;
if( right <= ld )
{
if( arb[ nod ].f > lung )
{
lung = arb[ nod ].f;
poz = arb[ nod ].s;
}
return;
}
query( 2 * nod , left , middle , ld , lung , poz );
if( middle + 1 <= ld )
query( 2 * nod + 1 , middle + 1 , right , ld , lung , poz );
}
void update( int nod, int left, int right, int poz, int val, int ln )
{
int middle = ( left + right ) / 2;
if( left == right )
{
arb[ nod ].f = ln;
arb[ nod ].s = val;
return;
}
if( middle >= poz )
update( 2 * nod , left , middle , poz , val , ln );
else
update( 2 * nod + 1 , middle + 1 , right , poz , val , ln );
if( arb[ 2 * nod ] > arb[ 2 * nod + 1 ] )
arb[ nod ] = arb[ 2 * nod ];
else
arb[ nod ] = arb[ 2 * nod + 1 ];
}
int main()
{
fin>>n;
for( i = 1 ; i <= n ; i++ )
{
fin>>v[ i ].f;
v[ i ].s = i;
}
sort( v + 1 , v + n + 1 , cmp );
for( i = 1 ; i <= n ; i++ )
{
lng = 0;
pos = 0;
query( 1 , 1 , n , v[ i ].s , lng , pos );
lng++;
if( lng > lngMax )
{
lngMax = lng;
startPos = i;
}
sol[ i ] = pos;
update( 1 , 1 , n , v[ i ].s , i , lng );
}
fout<<lngMax<<'\n';
pos = 1;
while( startPos != 0 )
{
ans[ pos++ ] = v[ startPos ].f;
startPos = sol[ startPos ];
}
for( i = lngMax ; i >= 1 ; i-- )
fout<<ans[ i ]<<' ';
return 0;
}