#include<cstdio>
#include<cmath>
#include<algorithm>
using namespace std;
long long H,arb[200010],N,a[200011],v[200011],l[210001],i,lst,mx;
void update(int Nod,int st,int dr,int poz,int val)
{
if (st==dr)
{
arb[Nod]=val;
return;
}
int mij=(st+dr)/2;
if (poz<=mij)
{
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 maxarb(int Nod,int st,int dr,int poz)
{
if (st==dr)
{
return arb[Nod];
}
int mij=(st+dr)/2;
if (poz<=mij)
{
return maxarb(Nod*2,st,mij,poz);
}
else return max(arb[Nod*2],maxarb(Nod*2+1,mij+1,dr,poz));
}
bool cmp(int i,int j)
{
return (v[i]<v[j]);
}
int main()
{
freopen("scmax.in","r",stdin);
freopen("scmax.out","w",stdout);
scanf("%lld",&N);
for (i=1;i<=N;i++)
{
scanf("%lld",&v[i]);
a[i]=v[i];
}
sort(a+1,a+N+1);
H=0;
for (i=1;i<=N;i++)
{
if (a[i]!=a[H])
{
++H;
a[H]=a[i];
}
}
for (i=1;i<=N;i++)
{
v[i]=lower_bound(a+1,a+H+1,v[i])-a;
}
for (i=1;i<=N;i++)
{
if (v[i]==1)
{
l[1]=1;
}
else
l[v[i]]=maxarb(1,1,N,v[i]-1)+1;
update(1,1,N,v[i],l[v[i]]);
}
printf("%lld\n",arb[1]);
mx=arb[1];
for (i=1;i<=N;i++)
{
if(l[i]==mx)
{
lst=i;
break;
}
}
v[1]=a[lst];
for (i=lst-1;i>=1;i--)
{
if (l[i]==l[lst]-1)
{
v[mx-l[i]+1]=a[i];
lst=i;
}
}
for (i=mx;i>=1;i--)
{
printf("%lld ",v[i]);
}
printf("\n");
return 0;
}