#include <iostream>
#include <fstream>
using namespace std;
ifstream f("scmax.in");
ofstream g("scmax.out");
int n,v[1005],best[1005],p[1005],L[1005],nr,maxim,k,poz;
void citire()
{
f>>n;
for (int i = 1; i <= n; ++i)
f>>v[i];
}
int caut(int x)
{
int st,dr,mij;
st=0;
dr=nr;
mij=(st+dr)/2;
while(st<=dr)
{
if(v[L[mij]]<x && v[L[mij+1]]>=x)
return mij;
else if (v[L[mij+1]]<x)
{
st=mij+1;
mij=(st+dr)/2;
} else
{
dr=mij-1;
mij=(st+dr)/2;
}
}
return nr;
}
void afis(int i)
{
if(p[i]>0)
afis(i);
g<<i<<' ';
}
int main() {
citire();
nr=1;
best[1]=L[1]=1;L[0]=0;
for (int 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 (int i = 1; i <= n; ++i)
if(maxim<best[i])
{
maxim=best[i];
poz=i;
}
int afisare[1005],ind=0;
g<<maxim<<'\n';
afisare[ind++]=v[poz];
while(p[poz]>0)
{
poz=p[poz];
afisare[ind++]=v[poz];
}
for (int i = ind-1; i >= 0; --i)
g<<afisare[i]<<' ';
return 0;
}