#include <bits/stdc++.h>
using namespace std;
ifstream in("scmax.in");
ofstream out("scmax.out");
int v[100005],norma[100005],a[400005],v1[100005],dp[100005];
int valMax,pozValMax;
vector<int> ans;
void update(int node,int st,int dr,int poz,int val)
{
int mid=(st+dr)/2;
if(st==dr)
{
a[node]=val;
return;
}
if(poz<=mid)
update(2*node,st,mid,poz,val);
else
update(2*node+1,mid+1,dr,poz,val);
a[node]=max(a[node*2],a[node*2+1]);
}
int query(int node,int st,int dr,int i,int j)
{
if(i<=st&&j>=dr)
return a[node];
int mid=(st+dr)/2;
int maxx=0,maxxx=0;
if(i<=mid)
maxx=query(2*node,st,mid,i,j);
if(j>mid)
maxxx=query(2*node+1,mid+1,dr,i,j);
return max(maxx,maxxx);
}
int main()
{
int n,ct=1,maxx=0;
in>>n;
for(int i=1;i<=n;i++)
{
in>>v[i];
v1[i]=v[i];
norma[i]=v[i];
}
sort(v1+1,v1+n+1);
for(int i=1;i<=n;i++)
{
norma[i]=lower_bound(v1+1,v1+n+1,norma[i])-v1;
}
for(int i=1;i<=n;i++)
{
if(norma[i]==1)
maxx=0;
else
maxx=query(1,1,n,1,norma[i]-1);
update(1,1,n,norma[i],maxx+1);
dp[i]=maxx+1;
if(maxx+1>valMax)
{
valMax=maxx+1;
pozValMax=i;
}
}
out<<valMax<<"\n";
for(int i=pozValMax;i>=1;i--)
{
if(dp[i]==valMax)
{
ans.push_back(v1[norma[i]]);
valMax--;
}
}
for(int i=ans.size()-1;i>=0;i--)
out<<ans[i]<<" ";
// for(int i=1;i<=n;i++)
// cout<<norma[i]<<" ";
return 0;
}