#include<cstdio>
#include<algorithm>
using namespace std;
int poz,maxi,v2,nr,p,u,m,n,i,arb[200010],l[100002],d[100002],a[100002],v1[100002],v[100002];
void update(int nod,int st,int dr,int poz,int val)
{
if(st==dr)
{
arb[nod]=max(arb[nod],val);
return ;
}
int mij=(st+dr)/2;
if(mij>=poz)
update(nod*2,st,mij,poz,val);
else
update(nod*2+1,mij+1,dr,poz,val);
arb[nod]=max(arb[nod*2],arb[nod*2+1]);
}
int q(int nod,int st,int dr,int poz)
{
if(st>=1&&poz>=dr) return arb[nod];
int mij=(st+dr)/2;
int v=0;
if(1<=mij)
v=max(v,q(nod*2,st,mij,poz));
if(poz>mij)
v=max(v,q(nod*2+1,mij+1,dr,poz));
return v;
}
int main()
{
freopen("scmax.in","r",stdin);
freopen("scmax.out","w",stdout);
scanf("%d",&n);
for(i=1;i<=n;i++)
{
scanf("%d",&a[i]);
v1[i]=a[i];
}
sort(v1+1,v1+n+1);
nr=1;
v[nr]=v1[1];
for(i=2;i<=n;i++)
if(v1[i]!=v1[i-1])
{
nr++;
v[nr]=v1[i];
}
for(i=1;i<=n;i++)
{
p=1;
u=nr;
while(p<=u)
{
m=(p+u)/2;
if(v[m]>a[i]) u=m-1;
else
if(v[m]<a[i]) p=m+1;
else break;
}
d[i]=m;
}
for(i=1;i<=n;i++)
{
if(d[i]>1) l[i]=1+q(1,1,n,d[i]-1);
else l[i]=1;
if(l[i]>maxi)
{
maxi=l[i];
poz=i;
}
update(1,1,n,d[i],l[i]);
}
//for(i=1;i<=n;i++)
//printf("%d ",l[i]);
printf("%d\n",maxi);
v2=maxi-1;
v1[v2+1]=a[poz];
for(i=poz-1;i>=1;i--)
if(l[i]==v2&&a[i]<v1[v2+1])
{
v1[v2]=a[i];
v2--;
}
for(i=1;i<=maxi;i++)
printf("%d ",v1[i]);
return 0;
}