#include<stdio.h>
#define NMAX 100000
int n,a[NMAX+1];
int l[NMAX+1],next[NMAX+1],max[NMAX*3];
void upd(int nod){
int i=1,j=n,k=1,mij;
while(i<=j){
if(i==j){
max[k]=nod;
k/=2;
while(k){
if(l[max[2*k]]>l[max[2*k+1]]) max[k]=max[2*k];
else max[k]=max[2*k+1];
k/=2;
}
break;
}
else{
mij=(i+j)/2;
if(nod<=mij) {k=2*k;j=mij;}
else {k=2*k+1;i=mij+1;}
}
}
}
void qry(int nod,int st,int dr,int ls,int &m){
int mij,mst,mdr;
if(1<=st&&dr<=ls){
m=max[nod];
}
else{
mij=(st+dr)/2;
if(1<=mij) qry(2*nod,st,mij,ls,mst);
if(mij<ls) qry(2*nod+1,mij+1,dr,ls,mdr);
if(l[mst]>l[mdr]) m=mst;
else m=mdr;
}
}
int main(){
freopen("scmax.in","r",stdin);
freopen("scmax.out","w",stdout);
int i,j,lmax,best,maxim,first;
scanf("%d",&n);
for(i=1;i<=n;i++) scanf("%d",&a[i]);
l[n]=1;upd(n);
for(i=n-1;i>0;i--){
qry(1,1,n,n,best);
if(a[i]<a[best]) l[i]=1+l[best];
else l[i]=l[best];
next[i]=best;
upd(i);
}
lmax=0;first=0;
for(i=1;i<=n;i++)
if(l[i]>lmax) {lmax=l[i];first=i;}
printf("%d\n",lmax);
i=first;
while(next[i]!=0){
printf("%d ",a[i]);
i=next[i];
}
printf("%d",a[i]);
return 0;
}