#include <bits/stdc++.h>
using namespace std;
ifstream f("scmax.in");
ofstream g("scmax.out");
int arbint[400005];
pair < int , int > p[100005];
int n;
int v[100005],lis[100005];
int max_nr = 2000000001;
stack < int > st;
bool compare(pair < int , int > a, pair < int, int > b) {
if (a.first == b.first) return a.second > b.second;
return a.first < b.first;
}
void buildTree(int pos, int st, int dr, int index, int value){
if (index<st || index>dr) return;
if (st==dr) {
arbint[pos] = value;
lis[st] = value;
return;
}
int mij = (dr+st)/2;
buildTree(2*pos,st,mij,index,value);
buildTree(2*pos+1,mij+1,dr,index,value);
arbint[pos] = max(arbint[2*pos],arbint[2*pos+1]);
}
int findMax(int pos, int st, int dr, int start, int end){
if (st>=start && dr<=end) return arbint[pos];
if (start>dr || end<st) return 0;
int mij = (dr+st)/2;
return max(findMax(2*pos,st,mij,start,end),findMax(2*pos+1,mij+1,dr,start,end));
}
void findLIS() {
for (int i=1;i<=n;i++) {
f >> v[i];
p[i].first = v[i];
p[i].second = i;
}
sort(p+1,p+n+1,compare);
for (int i=1;i<=n;i++) {
buildTree(1,1,n,p[i].second,findMax(1,1,n,1,p[i].second)+1);
}
}
int main()
{
f >> n;
findLIS();
g << arbint[1] << '\n';
for (int i=n;i>=1;i--) {
if (lis[i]==arbint[1] && v[i]<max_nr) {
arbint[1]--;
st.push(v[i]);
max_nr = v[i];
}
}
while (st.empty()==0) {
g << st.top() << " ";
st.pop();
}
return 0;
}