#include <iostream>
#include <fstream>
#define NMAX 100005
std::ifstream fin("scmax.in");
std::ofstream fout("scmax.out");
int path[NMAX];
long long arr[NMAX];
int N, end;
void afisare(int end_index) {
if (path[end_index] != -1) {
afisare(path[end_index]);
}
fout << arr[end_index] << " ";
}
int maximum_length() {
int *L, i, j, max = 0;
L = new int[N];
for (i = 0; i < N; i++) {
L[i] = 1;
path[i] = -1;
}
/* Compute optimized L values in bottom up manner */
for (i = 1; i < N; i++) {
for (j = 0; j < i; j++) {
if (arr[i] > arr[j] && L[i] < L[j] + 1) {
L[i] = L[j] + 1;
path[i] = j;
}
}
}
for (i = 0; i < N; i++) {
if (max < L[i]) {
max = L[i];
end = i;
}
}
delete[] L;
return max;
}
int main() {
fin >> N;
for (int i = 0; i < N; i++) {
fin >> arr[i];
}
fout << maximum_length() << '\n';
afisare(end);
return 0;
}