#include <fstream>
#include <algorithm>
#include <vector>
using namespace std;
ifstream fi("scmax.in");
ofstream fo("scmax.out");
const int NMAX=1e5+5;
int n,arb[4*NMAX],ind[4*NMAX],poz,sol,y[NMAX],mx,best[NMAX],pre[NMAX];
pair <int,int> x[NMAX];
vector <int> v;
void update(int nod,int a,int b,int pos,int val)
{
if(a==b)
{
arb[nod]=val;
ind[nod]=pos;
return ;
}
int mij=(a+b)/2;
if(pos<=mij)
update(2*nod,a,mij,pos,val);
else
update(1+2*nod,mij+1,b,pos,val);
if(arb[2*nod]>=arb[2*nod+1])
{
arb[nod]=arb[2*nod];
ind[nod]=ind[2*nod];
}
else
{
arb[nod]=arb[2*nod+1];
ind[nod]=ind[2*nod+1];
}
}
void query(int nod,int st,int dr,int a,int b)
{
if(a<=st && b>=dr)
{
if(sol<arb[nod])
{
poz=ind[nod];
sol=arb[nod];
}
return;
}
int mij=(st+dr)/2;
if(a<=mij)
query(2*nod,st,mij,a,b);
if(b>=mij+1)
query(2*nod+1,mij+1,dr,a,b);
}
int cmp(pair <int,int> A,pair <int,int> B)
{
if(A.first<B.first)
return 1;
if(A.first>B.first)
return 0;
return (A.second>B.second);
}
int main()
{
fi>>n;
for(int i=1;i<=n;i++)
{
fi>>x[i].first;
y[i]=x[i].first;
x[i].second=i;
}
sort(x+1,x+n+1,cmp);
update(1,1,n,x[1].second,1);
best[1]=1;
for(int i=2;i<=n;i++)
{
sol=0;
poz=0;
query(1,1,n,1,x[i].second);
best[i]=sol+1;
pre[x[i].second]=poz;
update(1,1,n,x[i].second,sol+1);
}
mx=1;
for(int i=1;i<=n;i++)
if(best[i]>best[mx])
mx=i;
fo<<best[mx]<<"\n";
v.push_back(y[x[mx].second]);
poz=pre[mx];
while(poz)
{
v.push_back(y[poz]);
poz=pre[poz];
}
for(int i=v.size()-1;i>=0;i--)
fo<<v[i]<<" ";
fi.close();
fo.close();
return 0;
}