#include <stdio.h>
#define MAXN 100010
long arb[MAXN], v[100010], n, i, fr[MAXN], sol, af, poz, S[MAXN], h[MAXN], last;
inline long min(long a, long b) {
if (a > b && b != 2000000000)
return b;
return a;
}
int parc(long st, long dr, long pz) {
if(st == dr) {
if( arb[pz] >= v[i] ) return 0;
return st;
}
if( arb[pz*2+1] < v[i])
return parc((st+dr)/2 + 1, dr, pz*2+1);
else return parc(st, (st+dr)/2, pz*2);
}
void update(int unde, int val, int st, int dr, int pz) {
if( st > unde || unde > dr ) return;
if( st == dr) {
arb[pz] = val;
return;
}
update( unde, val, st, (st+dr)/2, pz*2);
update( unde, val, (st+dr)/2 +1, dr, pz*2+1);
arb[pz] = min(arb[pz*2], arb[pz*2+1]);
}
int main() {
freopen("scmax.in", "r", stdin);
freopen("scmax.out", "w", stdout);
scanf("%ld", &n);
for (i = 1; i <= n; ++i) scanf("%ld", &v[i]);
for (i = 1; i < 10000; ++i) arb[i] = 2000000000;
for (i = 1; i <= n; ++i) {
af = 0;
int poz = parc(1, n, 1);
h[i] = poz + 1;
if( h[i] > sol) sol = h[i];
update(poz+1, v[i], 1, n, 1);
}
printf("%ld\n", sol);
long caut = sol;
for (i = n; i >= 1; --i) {
if (caut == h[i]) {
S[++S[0]] = v[i];
--caut;
}
}
for (i = S[0]; i >= 1; --i) printf("%ld ", S[i]);
return 0;
}