#include<fstream>
#include<cstring>
#include<algorithm>
#include<unordered_map>
using namespace std;
int n, a[100005], b[100005], dp[100005], next[100005];
int aint[400005];
unordered_map<int, int> norm;
void update(int nod, int l, int r, int p, int v) {
if (l==r) aint[nod]=v;
else {
int mid=(l+r)/2;
if (p<=mid) update(2*nod,l,mid,p,v);
else update(2*nod+1,mid+1,r,p,v);
aint[nod]=max(aint[2*nod],aint[2*nod+1]);
}
}
int query(int nod, int l, int r, int a) {
if (l>=a) return aint[nod];
else {
int mid=(l+r)/2;
int m1 = 0, m2=0;
if (a<=mid) m1=query(2*nod,l,mid,a);
m2=query(2*nod+1,mid+1,r,a);
return max(m1,m2);
}
}
int main(void) {
ifstream cin("scmax.in");
ofstream cout("scmax.out");
cin>>n;
for (int i=1; i<=n; ++i) { cin>>a[i]; b[i]=a[i]; }
sort(b+1,b+n+1);
int aux=1;
norm[b[1]]=aux;
for (int i=2; i<=n; ++i)
if (b[i]!=b[i-1]) {
++aux;
norm[b[i]]=aux;
}
dp[n]=1;
int sol=1;
int st=n;
update(1,1,n,norm[a[n]],1);
for (int i=n-1; i>=1; --i) {
dp[i]=query(1,1,n,norm[a[i]]+1)+1;
update(1,1,n,norm[a[i]],dp[i]);
if (dp[i]>sol) { sol=dp[i]; st=i; }
}
cout<<sol<<"\n";
cout<<a[st]<<" ";
for (int i=st+1; i<=n; ++i)
if (dp[i]=dp[st-1] && a[i]>a[st]) {
cout<<a[i]<<" ";
st=i;
}
return 0;
}