#include <bits/stdc++.h>
#define L (pos << 1)
#define R (L | 1)
using namespace std;
ifstream in("scmax.in");
ofstream out("scmax.out");
struct lol{
int val, idx;
};
int n, cnt, pv[100100], value[100100], last;
lol a[100100], h[400100];
bool cmp(const lol &a, const lol &b){
return a.val < b.val;
}
bool cmp2(const lol &a, const lol &b){
return a.idx < b.idx;
}
void update(int st, int dr, int pos, int idx, lol nr){
if(st == dr){
if(nr.val > h[pos].val)
h[pos] = nr;
return;
}
int mid = st + dr >> 1;
if(idx <= mid)
update(st, mid, L, idx, nr);
else
update(mid + 1, dr, R, idx, nr);
h[pos] = (h[L].val > h[R].val ? h[L] : h[R]);
}
lol query(int st, int dr, int pos, int l, int r){
if(l <= st && dr <= r)
return h[pos];
int mid = st + dr >> 1;
lol left, right;
left = right = {0, 0};
if(l <= mid)
left = query(st, mid, L, l, r);
if(r > mid)
right = query(mid + 1, dr, R, l, r);
return (left.val > right.val ? left : right);
}
void dive(int p){
if(p == 0)
return;
dive(pv[p]);
out << value[a[p].val] << ' ';
}
int main(){
in >> n;
for(int i = 1; i <= n; i++)
in >> a[i].val, a[i].idx = i;
sort(a + 1, a + n + 1, cmp);
last = 0;
for(int i = 1; i <= n; i++){
if(a[i].val > last){
last = a[i].val;
cnt++;
value[cnt] = last;
}
a[i].val = cnt;
}
sort(a + 1, a + n + 1, cmp2);
for(int i = 1; i <= n; i++){
int p = a[i].val;
if(p == 1){
update(1, cnt, 1, p, {1, i});
continue;
}
lol w = query(1, cnt, 1, 1, p - 1);
w.val++;
pv[i] = w.idx;
w.idx = i;
update(1, cnt, 1, p, w);
}
lol w = query(1, cnt, 1, 1, cnt);
out << w.val << '\n';
int p = w.idx;
dive(p);
return 0;
}