#include <fstream>
using namespace std;
ifstream fin("scmax.in");
ofstream fout("scmax.out");
#define maxn 100005
int i,N,a,b,MAX,imax,pmax,vmax;
int v[maxn],id[maxn],ids[maxn],Smax[maxn],A[4*maxn],P[4*maxn];
int from[maxn],Sir[maxn];
void citire()
{
fin >> N;
for(i=1;i<=N;i++)
fin >> v[i];
}
inline int max(int a, int b)
{
return a>b ? a : b;
}
void sort(int st, int m, int dr)
{
int i,j,k,aux[dr-st+2];
i=1;j=st;
while(j<=m)
aux[i++]=id[j++];
i=1; k=st;
while(k<j && j<=dr)
if(v[aux[i]]<=v[id[j]])
id[k++]=aux[i++];
else
id[k++]=id[j++];
while(k<j)
id[k++]=aux[i++];
}
void msort(int st, int dr)
{
if(st<dr)
{
int m=st+(dr-st)/2;
msort(st,m);
msort(m+1,dr);
sort(st,m,dr);
}
}
void update(int k, int st, int dr)
{
if(st==dr)
{
A[k]=b;
return;
}
int m=(st+dr)>>1;
if(a<=m) update(k<<1,st,m);
else update((k<<1)+1,m+1,dr);
if(Smax[A[k<<1]]>Smax[A[(k<<1)+1]]) A[k]=A[k<<1];
else A[k]=A[(k<<1)+1];
}
void query(int k, int st, int dr)
{
if(a<=st && dr<=b)
{
if(Smax[A[k]]>Smax[pmax])
pmax=A[k];
return;
}
int m=(st+dr)>>1;
if(a<=m) query(k<<1,st,m);
if(m<b) query((k<<1)+1,m+1,dr);
}
void pd()
{
for(i=1;i<=N;i++)
{
pmax=0;
a=1; b=ids[i]-1;
for(;b>0 && v[i]==v[id[b]];b--);
if(b) query(1,1,N);
Smax[i]=Smax[pmax]+1;
from[i]=pmax;
if(Smax[i]>MAX)
{
MAX=Smax[i];
imax=i;
}
a=ids[i]; b=i;
update(1,1,N);
}
}
void afisare()
{
int k,NR=MAX;
for(k=imax;k>0;k=from[k])
Sir[NR--]=v[k];
fout << MAX << '\n';
for(i=1;i<=MAX;i++)
fout << Sir[i] << ' ';
}
int main()
{
citire();
for(i=1;i<=N;i++) id[i]=i; // id[i]=poz in v al celui de-al i-lea el in vs.
msort(1,N);
for(i=1;i<=N;i++) ids[id[i]]=i; // ids[i]=poz in id al el. v[i]
pd();
afisare();
}