#include <climits>
#include <cstdio>
#include <algorithm>
using namespace std;
int f[100005],g[100005],p[100005],x,k,i,m,n,j,ok,poz,ct;
int *p1;
void afis(int k,int ct,int x)
{
if(ct==0)
return;
if(p[k]==ct&&x>f[k])
{
afis(k-1,ct-1,f[k]);
printf("%d ",f[k]);
}
else
afis(k-1,ct,x);
}
int main()
{
freopen("scmax.in","r",stdin);
freopen("scmax.out","w",stdout);
scanf("%d",&x);
for(k=1;k<=x;k++)
scanf("%d",&f[k]);
for(g[1]=f[1],p[1]=1,k=2,j=2;k<=x;k++)
{
if(f[k]>g[j-1])
{
g[j]=f[k];
p[k]=j;
j++;
}
else
{
if(f[k]<g[1])
{
g[1]=f[k];
p[k]=1;
}
else
{
p1=upper_bound(g+1,g+j-1,f[k]);
poz=p1-g;
//cout<<poz<<" "<<k<<" "<<f[k]<<endl;
if(g[poz-1]==f[k])
p[k]=poz-1;
else
{
g[poz]=f[k];
p[k]=poz;
}
}
}
/*for(i=1,ct=0;i<=k;i++)
cout<<g[i]<<" ";
cout<<endl;
for(i=1,ct=0;i<=k;i++)
cout<<p[i]<<" ";
*/}
for(k=1,ct=0;k<=x;k++)
ct=max(ct,p[k]);
printf("%d\n",ct);
/*for(k=x,m=INT_MAX,i=ct;k>=1;k--)
{
if(i==0)
break;
if(p[k]==i&&m>f[k])
{
m=f[k];
i--;
printf("%d ",f[k]);
}
}*/
afis(x,ct,INT_MAX);
return 0;
}