#include <bits/stdc++.h>
#define nmax 100005
using namespace std;
ifstream in("scmax.in");
ofstream out("scmax.out");
int n,arb[4*nmax],dp[nmax],last[nmax],cpy[nmax];
pair<int,int>v[nmax];
vector<int>sol;
void update(int st,int dr,int poz,int pz,int val)
{
if(st>pz || dr<pz) return;
if(st==dr)
{
arb[poz]=pz;
dp[pz]=val;
return;
}
int mid=(st+dr)/2;
update(st,mid,poz*2,pz,val);
update(mid+1,dr,poz*2+1,pz,val);
if(dp[arb[poz*2]]<dp[arb[poz*2+1]]) arb[poz]=arb[poz*2+1];
else arb[poz]=arb[poz*2];
}
int fnd(int st,int dr,int poz,int a,int b)
{
if(st>b || dr<a) return 0;
if(st>=a && dr<=b) return arb[poz];
int mid=(st+dr)/2;
int e1=fnd(st,mid,2*poz,a,b);
int e2=fnd(mid+1,dr,2*poz+1,a,b);
if(dp[e1]<dp[e2]) return e2;
else return e1;
}
bool cmp(pair<int,int> st,pair<int,int> dr)
{
if(st.first==dr.first) return st.second>dr.second;
return st.first<dr.first;
}
void read()
{
in>>n;
for(int i=1;i<=n;i++)
{
in>>v[i].first;
cpy[i]=v[i].first;
v[i].second=i;
}
}
void solve()
{
sort(v+1,v+n+1,cmp);
for(int i=1;i<=n;i++)
{
int elem=fnd(1,n,1,1,v[i].second);
update(1,n,1,v[i].second,dp[elem]+1);
last[v[i].second]=elem;
}
out<<dp[arb[1]]<<'\n';
for(int pz=arb[1];pz!=0;pz=last[pz])
{
sol.push_back(pz);
}
for(int i=sol.size()-1;i>=0;i--)
{
out<<cpy[sol[i]]<<' ';
}
}
int main()
{
read();
solve();
return 0;
}