#include <cstdio>
#include <algorithm>
using namespace std;
struct vect{int val;int ind;};
struct di{int nr;int wh;};
vect v[100002];
di din[100002];
vect arb[300002];
int mx,indice,sol[100002],v2[100002];
int cmp(vect a,vect b)
{
return (a.val<b.val)||(a.val==b.val&&a.ind>b.ind);
}
void recalculate(int node)
{
if(arb[2*node].val>arb[2*node+1].val||(arb[2*node].val==arb[2*node+1].val&&arb[2*node].ind<arb[2*node+1].ind))
arb[node]=arb[2*node];
else arb[node]=arb[2*node+1];
}
void update(int poz,int k,int node,int st,int dr)
{
if(poz==st&&st==dr)
arb[node].val=k,arb[node].ind=poz;
else
{
int mid=(st+dr)/2;
if(poz<=mid)
update(poz,k,2*node,st,mid);
else update(poz,k,2*node+1,mid+1,dr);
recalculate(node);
}
}
void query(int a,int b,int node,int st,int dr)
{
if(a<=st&&dr<=b)
{
if(arb[node].val>mx)
mx=arb[node].val,indice=arb[node].ind;
}
else
{
int mid=(st+dr)/2;
if(a<=mid)
query(a,b,2*node,st,mid);
if(b>=mid+1)
query(a,b,2*node+1,mid+1,dr);
}
}
int main()
{
freopen("scmax.in","r",stdin);
freopen("scmax.out","w",stdout);
int n,i;
scanf("%d",&n);
for(i=1;i<=n;i++)
{
scanf("%d",&v[i].val);
v2[i]=v[i].val;
v[i].ind=i;
}
sort(&v[1],&v[n+1],cmp);
for(i=1;i<=n;i++)
{
mx=-1;
indice=0;
query(0,v[i].ind-1,1,0,n);
din[v[i].ind].nr=din[indice].nr+1;
din[v[i].ind].wh=indice;
update(v[i].ind,din[v[i].ind].nr,1,0,n);
}
mx=-1;
for(i=1;i<=n;i++)
if(din[i].nr>mx)
mx=din[i].nr,indice=i;
for(i=mx;i>=1;i--)
{
sol[i]=v2[indice];
indice=din[indice].wh;
}
printf("%d\n",mx);
for(i=1;i<=mx;i++)
printf("%d ",sol[i]);
return 0;
}