#include <stdio.h>
int min[100001],nr;//min[i]=pozitia celui mai mic numar ce,
//plasat intr-un subsir, este al i-lea in subsirul respectiv
int p[100001],v[100001],n;
void afis(int i,FILE *fout){
if(p[i]>0){
afis(p[i],fout);
}
fprintf(fout,"%d ",v[i]);
}
int caut(int a){
int i,pas;
i=0;
for(pas=1<<16;pas>0;pas>>=1){
if((i+pas<=nr)&&(v[min[i+pas]]<a)){
i+=pas;
}
}
return i;
}
int main(){
int i,poz,end;
FILE *fin,*fout;
fin=fopen("scmax.in","r");
fout=fopen("scmax.out","w");
fscanf(fin,"%d",&n);
for(i=1;i<=n;i++){
fscanf(fin,"%d",&v[i]);
}
nr=1;
end=1;
min[1]=1;
for(i=2;i<=n;i++){
poz=caut(v[i]);//aflu cea mai mare pozitie pentru care v[min[poz]]<v[i]
p[i]=min[poz];//pozitia numarului dupa care plasam v[i] in subsirul crescator maximal
min[poz+1]=i;//actualizam pozitia minimul
if(nr<poz+1){
nr=poz+1;//lungimea maxima a unui subsir
end=i;//pentru a afisa la final subsirul crescator maximal
}
}
fprintf(fout,"%d\n",nr);
afis(end,fout);
fprintf(fout,"\n");
fclose(fin);
fclose(fout);
return 0;
}