#include<fstream>
using namespace std;
ofstream out("scmax.out");
int n,v[100001],best[100001],p[100001],maxim,nr,L[100001];
void rec(int i) { if(p[i]>0) rec(p[i]); out<<v[i]<<" "; }
int caut(int x) {
int i=0,j=nr,mij;
while(i<=j) {
mij=(i+j)/2;
if(v[L[mij]]<x && v[L[mij+1]]>=x) return mij;
else if(v[L[mij+1]]<x) i=mij+1;
else j=mij-1;
}
return nr;
}
int main() {
ifstream in("scmax.in");
int i,j,poz; nr=1;
in>>n;
for(i=1;i<=n;i++) in>>v[i];
in.close();
best[1]=L[1]=1; L[0]=0;
for(i=2;i<=n;i++) {
poz=caut(v[i]);
p[i]=L[poz];
best[i]=poz+1;
L[poz+1]=i;
if(nr<poz+1) nr=poz+1;
}
maxim=0; poz=0;
for(i=1;i<=n;i++)
if(maxim<best[i]) {
maxim=best[i]; poz=i;
}
out<<maxim<<endl;
rec(poz);
out.close();
return 0;
}