#include <iostream>
#include <fstream>
#include <algorithm>
using namespace std;
ifstream f("scmax.in");
ofstream g("scmax.out");
struct r{
int nr,pos;
}srt[100005];
int last=100001,mx,n,a[100005],arb[400005],ch,v[100005],m,rez[100005];
string s;
bool comp(r a, r b)
{
if(a.nr==b.nr) return(a.pos>b.pos);
return (a.nr<b.nr);
}
int nextint()
{
int num=0;
while(s[ch]==' ') ++ch;
while(s[ch]<='9' && s[ch]>='0')
{
num=num*10+s[ch]-'0';
++ch;
}
return num;
}
void query(int nod,int lt,int rt,int x,int y)
{
if(lt>y || rt<x) return;
if(x<=lt && rt<=y)
{
m=max(m,arb[nod]);
return;
}
int md=(lt+rt)/2;
if(md>=x) query(nod*2,lt,md,x,y);
if(md<y) query(nod*2+1,md+1,rt,x,y);
}
void update(int nod,int lt,int rt,int pos)
{
if(lt==rt)
{
arb[nod]=m;
return;
}
int md=(lt+rt)/2;
if(pos<=md) update(nod*2,lt,md,pos);
else update(nod*2+1,md+1,rt,pos);
arb[nod]=max(arb[nod*2],arb[nod*2+1]);
}
int main()
{
f>>n; getline(f,s); getline(f,s);
for(int i=1;i<=n;++i)
{
srt[i].nr=nextint();
srt[i].pos=i;
}
sort(srt+1,srt+n+1,comp);
for(int i=1;i<=n;++i) v[srt[i].pos]=i;
for(int i=1;i<=n;++i)
{
m=0;
query(1,1,n,1,v[i]); ++m;
mx=max(mx,m);
update(1,1,n,v[i]);
a[i]=m;
}
m=mx;
g<<mx<<'\n';
for(int i=n;i>=1;--i)
{
if(a[i]==mx && v[i]<last)
{
rez[mx]=srt[v[i]].nr;
--mx;
last=v[i];
}
}
for(int i=1;i<=m;++i) g<<rez[i]<<' ';
return 0;
}