#include <bits/stdc++.h>
using namespace std;
ifstream in("scmax.in");
ofstream out("scmax.out");
vector<int> sol;
const int NMAX=100005;
int n;
int a[NMAX],poz[NMAX],da[NMAX],v[4*NMAX];
int val,pozval;
int getmax(int node,int st,int dr,int x,int y)
{
if(x<=st&&dr<=y)
return v[node];
int mj=(dr+st)/2;
int max1=0;
int max2=0;
if( x<=mj)
max1=getmax(2*node,st,mj,x,y);
if( y>mj)
max2=getmax(2*node+1,mj+1,dr,x,y);
return max(max1,max2);
}
void update(int node,int st,int dr,int poz,int val)
{
int mj=(dr+st)/2;
if( st==dr)
{
v[node]=val;
return;
}
if(poz<=mj)
update(2*node,st,mj,poz,val);
else
update(2*node+1,mj+1,dr,poz,val);
v[node]=max(v[2*node],v[2*node+1]);
}
int main()
{
int i;
in>>n;
for(i=1;i<=n;i++)
{
in>>a[i];
poz[i]=a[i];
}
sort(a+1,a+n+1);
for(i=1;i<=n;i++)
poz[i]=lower_bound(a+1,a+n+1,poz[i])-a;
for(i=1;i<=n;i++)
{
int maxim;
if(poz[i]==1)
maxim=0;
else
maxim=getmax(1,1,n,1,poz[i]-1);
update(1,1,n,poz[i],maxim+1);
da[i]=maxim+1;
if(maxim+1>val)
{
val=maxim+1;
pozval=i;
}
}
out<<val<<'\n';
for(i=pozval;i>=1;i--)
{
if( da[i]==val)
{
sol.push_back(a[poz[i]]);
val--;
}
}
for(i=sol.size()-1;i>=0;i--)
out<<sol[i]<<" ";
return 0;
}