#include <bits/stdc++.h>
using namespace std;
ifstream fin ("scmax.in");
ofstream fout ("scmax.out");
const int NMAX = 1e5;
int n, aib[NMAX + 5], v_ini[NMAX + 5], v[NMAX + 5], lung[NMAX + 5];
pair <int, int> aux[NMAX + 5];
void normalizare () {
for (int i = 1; i <= n; i++) {
aux[i].first = v_ini[i];
aux[i].second = i;
}
sort (aux + 1, aux + 1 + n);
int val_c = 1;
v[aux[1].second] = val_c;
for (int i = 2; i <= n; i++) {
if (aux[i].first > aux[i - 1].first)
val_c++;
v[aux[i].second] = val_c;
}
}
void update (int poz, int val) {
while (poz <= n) {
aib[poz] = max (aib[poz], val);
int p2 = (poz & (-poz));
poz += p2;
}
}
int query (int poz) {
int maxim = 0;
while (poz > 0) {
maxim = max (maxim, aib[poz]);
int p2 = (poz & (-poz));
poz -= p2;
}
return maxim;
}
void refac_subsirul (int poz, int lung_c, int reper) {
if (lung_c == 0 || poz == 0)
return;
if (lung[poz] == lung_c && v_ini[poz] < reper) {
refac_subsirul (poz - 1, lung_c - 1, v_ini[poz]);
fout << v_ini[poz] << " ";
}
else
refac_subsirul (poz - 1, lung_c, reper);
}
int main() {
fin >> n;
for (int i = 1; i <= n; i++)
fin >> v_ini[i];
normalizare ();
int poz_max = 0;
for (int i = 1; i <= n; i++) {
int l = query (v[i] - 1);
lung[i] = l + 1;
if (lung[i] > lung[poz_max])
poz_max = i;
update (v[i], lung[i]);
}
fout << lung[poz_max] << "\n";
refac_subsirul(poz_max, lung[poz_max], INT_MAX);
fout << "\n";
return 0;
}