#include <iostream>
#include <fstream>
#include <algorithm>
#include <vector>
using namespace std;
ifstream f("scmax.in");
ofstream g("scmax.out");
struct vec
{int pos; int val;};
vec v[100005];
int n,a[300005],best[100005],v2[100005],sol=0,mx,nr,sub[100005],k;
const int mod=13831;
vector <int> num[mod];
vector <int> key[mod];
void Solve(int x,int xkey)
{ int i,l=x%mod;
for(i=0;i<num[l].size();i++)
if (num[l][i]==x) {if (xkey<key[l][i]) key[l][i]=xkey; return;}
num[l].push_back(x);
key[l].push_back(xkey);
}
int Value(int x)
{ int i,l=x%mod;
for(i=0;i<num[l].size();i++)
if (num[l][i]==x) return key[l][i];
}
bool comp(vec x,vec y)
{ if (x.val==y.val) return x.pos<y.pos;
return x.val<y.val;
}
void Read()
{ int i;
f>>n;
for(i=1;i<=n;i++)
{f>>v[i].val; v[i].pos=i; v2[i]=v[i].val;}
}
void Query(int nod,int st,int dr,int x,int y)
{ int mid;
if (x<=st && dr<=y)
{ if (a[nod]>sol) sol=a[nod];}
else
{ mid=(st+dr)/2;
if (x<=mid) Query(2*nod,st,mid,x,y);
if (y>mid) Query(2*nod+1,mid+1,dr,x,y);
}
}
void Update(int nod,int st,int dr,int i,int value)
{ int mid;
if (st==dr)
{if (value>a[nod]) a[nod]=value;}
else
{ mid=(st+dr)/2;
if (i<=mid) Update(2*nod,st,mid,i,value);
else Update(2*nod+1,mid+1,dr,i,value);
a[nod]=max(a[2*nod],a[2*nod+1]);
}
}
int main()
{ int i;
Read();
sort(v+1,v+n+1,comp);
for(i=1;i<=n;i++) v[v[i].pos].val=i;
for(i=1;i<=n;i++) Solve(v2[i],v[i].val);
for(i=1;i<=n;i++) v[i].val=Value(v2[i]);
mx=0; nr=0;
for(i=1;i<=n;i++)
{ sol=0;
if (v[i].val>1) Query(1,1,n,1,v[i].val-1);
best[i]=sol+1;
if (best[i]>mx) {mx=best[i]; nr=v2[i];}
Update(1,1,n,v[i].val,best[i]);
}
mx++; k=0;
for(i=n;i>=1;i--)
if (best[i]==mx-1 && v2[i]<=nr)
{k++; sub[k]=v2[i]; mx--; nr=v2[i];}
g<<k<<"\n";
for(i=k;i>=1;i--) g<<sub[i]<<" ";
return 0;
}