#include <bits/stdc++.h>
#define NMAX 100009
using namespace std;
ifstream fin("scmax.in");
ofstream fout("scmax.out");
int v[4*NMAX];
vector<int> sol;
int n;
int a[NMAX];
int poz[NMAX];
int da[NMAX];
int val,pozval;
int getmax(int node, int st, int dr, int x, int y);
void update(int node, int st, int dr,int poz, int val);
int main()
{int i;
fin>>n;
for(i=1;i<=n;i++)
{fin>>a[i];
poz[i]=a[i];
}
sort(a+1,a+n+1);
for(i=1;i<=n;i++)
poz[i]= lower_bound( a+1,a+n+1,poz[i])-a;
for(i=1;i<=n;i++)
{int maxim;
if(poz[i]==1)
maxim=0;
else
maxim=getmax(1,1,n,1,poz[i]-1);
update( 1,1,n, poz[i], maxim+1);
da[i]=maxim+1;
if(maxim+1>val)
{val=maxim+1;pozval=i;}
}
//for(i=1;i<=n;i++)
// fout<<da[i]<<" ";
fout<<val<<'\n';
for(i=pozval;i>=1;i--)
{
if( da[i]==val)
{sol.push_back( a[ poz[i] ] );val--;}
}
for(i=sol.size()-1;i>=0;i--)
fout<<sol[i]<<" ";
return 0;
}
int getmax(int node, int st, int dr, int x, int y)
{
if( x<=st && dr<=y)
return v[node];
int mj=(dr+st)/2;
int max1=0;
int max2=0;
if( x<=mj)
max1= getmax(2*node,st,mj,x,y);
if( y>mj)
max2= getmax(2*node+1,mj+1,dr,x,y);
return max(max1,max2);
}
void update(int node, int st, int dr,int poz, int val)
{
int mj=(dr+st)/2;
if( st==dr)
{v[node]=val;return;}
if(poz<=mj)
update(2*node,st,mj,poz,val);
else
update(2*node+1,mj+1,dr,poz,val);
v[node]=max(v[2*node],v[2*node+1]);
}