#include <fstream>
#include <vector>
#include <algorithm>
using namespace std;
ifstream cin("scmax.in");
ofstream cout("scmax.out");
int i,n,k;
struct adat
{
int a,b,maxi; /*a-bal veg; b-jobb veg; maxi-leghosszabb monoton novekvo
reszsorozat hossza az a-b intervallumon*/
};
vector<adat>f(262144); /*intervallumfa*/
struct adat2
{
int i,e,l; /*i-index, e-ertek*/
};
vector<adat2>x; /*a sorozatom*/
int fa (int bal, int jobb, int i)
{
f[i].a=bal;
f[i].b=jobb;
f[i].maxi=0;
if(bal!=jobb)
{
fa(bal, (bal+jobb)/2, i*2);
fa((bal+jobb)/2+1, jobb, i*2+1);
}
}
int has (adat2 a, adat2 b)
{
if(a.e==b.e) return a.i>b.i;
return a.e<b.e;
}
int has2 (adat2 a, adat2 b)
{
return a.i<b.i;
}
int maximum (int i, int bal, int jobb) /*i-az adott elem indexe, ahol a faban vagyunk
bal-jobb az intervallum, amiben keressuk a max-ot*/
{
if(bal<f[i].a || jobb>f[i].b || jobb<bal) return 0;
else
if(f[i].a==bal && f[i].b==jobb) return f[i].maxi;
else
{
int maxi=0;
if(bal>=f[i*2].a && jobb<=f[i*2].b) maxi=maximum(i*2, bal, jobb);
else if(bal>=f[i*2+1].a && jobb<=f[i*2+1].b) maxi=maximum(i*2+1, bal, jobb);
else maxi=max(maximum(i*2, bal, f[i*2].b), maximum(i*2+1, f[i*2+1].a, jobb));
return maxi;
}
}
int betesz (int i, int h, int maxim) /*i-az adott elem indexe, ahol a faban vagyunk
h-annak az elemnek az indexe a sorzatban, amit beteszunk
maxim-milzen hosszu a leghosszabb reszsorozat, ha az aktualisan betett elem a vege*/
{
if(f[i].a==f[i].b && f[i].a==h) f[i].maxi=maxim;
else
{
if(f[i*2].a<=h && f[i*2].b>=h) betesz(i*2, h, maxim);
else betesz(i*2+1, h, maxim);
f[i].maxi=max(f[i*2].maxi, f[i*2+1].maxi);
}
}
int main()
{
cin>>n;
fa(1,n,1);
x.resize(n+1);
for(i=1;i<=n;++i)
{
cin>>x[i].e;
x[i].i=i;
}
sort(x.begin(), x.end(), has);
for(i=1;i<=n;++i)
{
k=maximum(1,1,x[i].i-1)+1;
betesz (1,x[i].i,k);
// for(int j=1;j<=25;++j) cout<<f[j].a<<"-"<<f[j].b<<" "<<f[j].maxi<<"\n";
// cout<<"\n";
x[i].l=k;
}
sort(x.begin(), x.end(), has2);
k=f[1].maxi;
vector<int>megold(k+1);
for(i=n;i>=1;--i)
{
if(x[i].l==k)
{
megold[k]=x[i].e;
k--;
}
}
cout<<f[1].maxi<<"\n";
for(i=1;i<=f[1].maxi;++i) cout<<megold[i]<<" ";
return 0;
}