#include <bits/stdc++.h>
using namespace std;
const int MAXN = 100000;
int v[MAXN + 1], aib[MAXN + 1], prec[MAXN + 1], vo[MAXN + 1], aibpoz[MAXN + 1], dp[MAXN + 1], vrez[MAXN];
struct nume {
int val, poz;
} v2[MAXN];
int xn;
char cmp(nume a, nume b) {
return a.val < b.val;
}
void addBit(int poz, int x, int p) {
while (poz <= xn) {
if (x > aib[poz]) {
aib[poz] = x;
aibpoz[poz] = p;
}
poz += (poz & (-poz));
}
}
int maxBit(int poz) {
int rez, p;
rez = p = 0;
while (poz > 0) {
if (aib[poz] > rez) {
rez = aib[poz];
p = aibpoz[poz];
}
poz &= (poz - 1);
}
return p;
}
int main()
{
FILE *fin, *fout;
int n, i, nr, poz;
fin = fopen("scmax.in", "r");
fscanf(fin, "%d", &n);
for (i = 1; i <= n; i++) {
fscanf(fin, "%d", &vo[i]);
v2[i - 1].val = vo[i];
v2[i - 1].poz = i;
}
fclose(fin);
//normalizez
sort(v2, v2 + n, cmp);
v[v2[0].poz] = xn = 1;
for (i = 1; i < n; i++) {
if (v2[i].val > v2[i - 1].val) {
xn++;
}
v[v2[i].poz] = xn;
}
nr = poz = 0;
for (i = 1; i <= n; i++) {
prec[i] = maxBit(v[i] - 1);
dp[i] = dp[prec[i]] + 1;
addBit(v[i], dp[i], i);
if (dp[i] > nr) {
nr = dp[i];
poz = i;
}
}
nr = 0;
while (poz > 0) {
vrez[nr] = vo[poz];
nr++;
poz = prec[poz];
}
fout = fopen("scmax.out", "w");
fprintf(fout, "%d\n", nr);
for (i = nr - 1; i >= 0; i--) {
fprintf(fout, "%d ", vrez[i]);
}
fprintf(fout, "\n");
fclose(fout);
return 0;
}