#include<cstdio>
#include<algorithm>
#define N 100001
using namespace std;
long x[N],y[N],a[N],t[1000000],n;
void rd()
{
scanf("%ld",&n);
for(long i=1;i<=n;i++)
{
scanf("%ld",&x[i]);
y[i]=x[i];
}
}
void ud(long x,long i,long j,long nd,long v)
{
if(i==j&&j==x)
{
t[nd]=v;
return;
}
long m=(i+j)/2;
if(m<x)
ud(x,m+1,j,nd*2,v);
else
ud(x,i,m,nd*2+1,v);
t[nd]=max(t[nd*2],t[nd*2+1]);
}
long qr(long x,long y,long i,long j,long nd)
{
if(x<=i&&j<=y)
return t[nd];
long m=(i+j)/2,s1=0,s2=0;
if(m<y)
s1=qr(x,y,m+1,j,nd*2);
if(x<=m)
s2=qr(x,y,i,m,nd*2+1);
return max(s1,s2);
}
void go()
{
sort(y+1,y+n+1);
long max=0,i;
for(i=n;i;i--)
{
long c=upper_bound(y+1,y+n+1,x[i])-y-1;
a[i]=qr(c+1,n,1,n,1)+1;
ud(c,1,n,1,a[i]);
if(max<a[i]) max=a[i];
}
printf("%ld\n",max);
for(i=1;i<=n;i++)
if(a[i]==max)
printf("%ld ",x[i]),max--;
}
int main()
{
freopen("scmax.in","r",stdin);
freopen("scmax.out","w",stdout);
rd();
go();
return 0;
}