#include <fstream>
using namespace std;
const int MAXN = 100005;
ifstream in("scmax.in");
ofstream out("scmax.out");
const int INF = 1 << 30;
int v[MAXN];
int n;
int minim[MAXN];//minim[i] - minimul unui subsir de lungime i
int pozpunere[MAXN];
int raspuns = 0;
void citire()
{
in >> n;
for (int i = 1;i <= n;++i)
in >> v[i];
}
int cautare_binara(int x)
{
int poz = 0;
for (int pas = 1 << 17;pas >= 1;pas >>= 1)
if (poz + pas <= raspuns && minim[poz + pas] < x)
poz += pas;
return poz;
}
void prelucrare()
{
for (int i = 1;i <= n;++i)
minim[i] = INF;
for (int i = 1;i <= n;++i)
{
int poz = cautare_binara(v[i]);
if (poz == raspuns)
++raspuns;
minim[poz + 1] = v[i];
pozpunere[i] = poz + 1;
}
}
void afisare()
{
out << raspuns << '\n';
int s[MAXN] = {0};
int ls = raspuns;
for (int i = n;i >= 1;--i)
if (pozpunere[i] == ls)
{
s[ls] = i;
--ls;
}
for (int i = 1;i <= raspuns;++i)
out << v[s[i]] << ' ';
out << '\n';
}
int main()
{
citire();
prelucrare();
afisare();
return 0;
}