#include <iostream>
#include <fstream>
#include <stack>
#include <algorithm>
#include <unordered_map>
using namespace std;
ifstream in("scmax.in");
ofstream out("scmax.out");
const int nMax = 100005;
unsigned int v[nMax];
unsigned int a[nMax];
unordered_map<int, int> m;
int n;
unsigned int ant[nMax];
const unsigned int INF = (1 << 31);
void citire()
{
in >> n;
for(int i = 1; i <= n; ++i)
{
in >> a[i];
}
}
void afisare(int x)
{
if(ant[x] != 0)
afisare(ant[x]);
out << m[x] << " ";
}
void normalize()
{
for(int i = 1; i <= n; ++i)
v[i] = a[i];
sort(v + 1, v + n + 1);
unsigned int tmp;
for(int i = 1; i <= n; ++i)
{
tmp = a[i];
a[i] = lower_bound(v + 1, v + n + 1, a[i]) - v;
m[a[i]] = tmp;
}
}
void rezolvare()
{
normalize();
for(int i = 1; i <= n; ++i)
v[i] = 0;
unsigned int mx;
unsigned int x;
for(int i = 1; i <= n; ++i)
{
mx = 0;
for(int j = 1; j < a[i]; ++j)
{
if(v[j] > mx)
{
mx = v[j];
ant[a[i]] = j;
}
}
v[a[i]] = max(v[a[i]], mx + 1);
}
mx = 0;
int sol;
for(int i = 1; i <= n; ++i)
{
if(v[i] > mx)
{
mx = v[i];
sol = i;
}
}
out << mx << "\n";
afisare(sol);
}
int main()
{
citire();
rezolvare();
}