#include <iostream>
#include <fstream>
#include <vector>
#include <algorithm>
using namespace std;
#define size 200000
int dim, n;
int val[size], st[size], last[size];
int searchPoz(int poz) {
int power = 1, s = 0;
for (; power*2 <= dim; power *= 2);
for (; power; power /=2) {
if (power + s <= dim && val[st[power+s]] < val[poz]) {
s += power;
}
}
s ++;
if (s > dim) {
dim ++;
}
return s;
}
void solve() {
dim = 1;
st[1] = 1;
for (int i =2; i <= n; i++) {
int poz = searchPoz(i);
st[poz] = i;
last[i] = st[poz - 1];
}
}
void afisare() {
ofstream g("scmax.out");
g << dim << '\n';
int poz = st[dim];
vector<int> sol;
for (; dim; dim --) {
sol.push_back(val[poz]);
poz = last[poz];
}
reverse(sol.begin(), sol.end());
for (vector<int> :: iterator it = sol.begin(); it < sol.end() ; it++) {
g << *it <<' ' ;
}
g.close();
}
void citire() {
ifstream f("scmax.in");
f >> n ;
for (int i = 1; i <=n ;i ++) {
f >> val[i];
}
f.close();
}
int main() {
citire();
solve();
afisare();
return 0;
}