#include <cstdio>
#include <iostream>
#include <queue>
#include <vector>
#include <fstream>
#include <algorithm>
#include <string>
#include <iomanip>
#include <cstring>
#include <map>
#include <iomanip>
#include <unordered_map>
#include <stack>
#include <bitset>
#define MOD 8192
#define pb push_back
#define INF 0x3f3f3f3f
#define ll long long
#define NMAX 100003
#define KMAX 33
using namespace std;
typedef pair<int, int> pii;
ifstream fin("scmax.in");
ofstream fout("scmax.out");
pii v[NMAX],aint[4*NMAX],aux[NMAX];
int Prev[NMAX],ans[NMAX];
void update_aib(int nod, int st, int dr, int pos, int val) {
if(st==dr) {
if(aint[nod].first<val)
aint[nod]={val,pos};
return;
}
int mid=(st+dr)/2,fs=(nod<<1);
if(pos<=mid) update_aib(fs,st,mid,pos,val);
else update_aib(fs+1,mid+1,dr,pos,val);
aint[nod]=max(aint[fs],aint[fs+1]);
}
pii query_aib(int nod, int st, int dr, int qst, int qdr) {
if(dr<qst || st>qdr) return {0,0};
if(qst<=st && qdr>=dr) return aint[nod];
int mid=(st+dr)/2,fs=(nod<<1);
return max(query_aib(fs,st,mid,qst,qdr), query_aib(fs+1,mid+1,dr,qst,qdr));
}
bool comp(pii A, pii B) {
if(A.first==B.first) return A.second>B.second;
else return A<B;
}
int main() {
int n,i,x,res=0;
pii maxstanga;
fin>>n;
for(i=1;i<=n;++i) {
fin>>x;
aux[i]=v[i]={x,i};
}
sort(v+1,v+n+1,comp);
for(i=1;i<=n;++i) {
maxstanga=query_aib(1,1,n,1,v[i].second-1);
res=max(res,maxstanga.first+1);
update_aib(1,1,n,v[i].second,maxstanga.first+1);
Prev[v[i].second]=maxstanga.second;
ans[v[i].second]=maxstanga.first+1;
}
fout<<res<<'\n';
vector<int> a;
for(i=1;i<=n;++i) {
if(ans[i]==res) {
do {
a.pb(aux[i].first);
i=Prev[i];
} while(i!=0);
break;
}
}
for(i=a.size()-1;i>=0;--i) fout<<a[i]<<' ';
return 0;
}