#include<iostream>
#include<cstdio>
#include<fstream>
using namespace std;
ofstream g("scmax.out");
int nr, best[100000], L[100000], v[100000], poz, prec[100000];
int cautare(int x)
{
long long pas=1<<30;
int i;
for (i=0; pas>0; pas>>=1)
if (i+pas<=nr && v[L[i+pas]]<x)
i+=pas;
return i+1;
}
void afisez_recursiv(int x)
{
if (x!=0)
{
afisez_recursiv(prec[x]);
g<<v[x]<<" ";
}
}
int main()
{
FILE *fin;
fin=fopen("scmax.in","r");
int n, i;
fscanf(fin, "%d", &n);
for(i=1; i<=n; i++)
{
fscanf(fin, "%d", &v[i]);
}
best[1]=1;
L[0]=0;
L[1]=1;
nr=1;
for(i=2; i<=n; i++)
{
poz=cautare(v[i]);
prec[i]=L[poz-1];
best[i]=poz;
L[poz]=i;
if(nr<poz)
nr=poz;
}
int maxim=0, pozmax;
for(i=1; i<=n; i++)
if(best[i]>maxim)
{maxim=best[i];
pozmax=i;
}
g<<maxim<<"\n";
afisez_recursiv(pozmax);
}