#include <iostream>
#include <set>
#include <fstream>
#include <algorithm>
using namespace std;
ifstream f ("scmax.in");
ofstream g ("scmax.out");
int n , i , m , x , y , arb[100005] , val , maxim , sol[600005] , solfin[600005] , cnt , init[100005];
struct manevra{
int first , second;
}v[100005];
bool cmp (manevra a , manevra b)
{
if (a.first < b.first)
return true;
if (a.first == b.first && a.second > b.second)
return true;
return false;
}
void update (int nod , int left , int right , int poz , int val)
{
if (left == right)
{
arb[nod] = val;
sol[poz] = val;
return;
}
int mij = (left + right) / 2;
if (poz <= mij)
update (2 * nod , left , mij , poz , val);
else
update (2 * nod + 1 , mij + 1 , right , poz , val);
arb[nod] = max (arb[2 * nod] , arb[2 * nod + 1]);
}
void querry (int nod , int left , int right , int ql , int qr)
{
if (ql <= left && right <= qr)
{
maxim = max (maxim , arb[nod]);
return;
}
int mij = (left + right) / 2;
if (ql <= mij)
querry (2 * nod , left , mij , ql , qr);
if (qr > mij)
querry (2 * nod + 1 , mij + 1 , right , ql , qr);
}
int main()
{
f >> n;
for (int i = 1 ; i <= n ; i++)
{
f >> init[i];
v[i].first = init[i];
v[i].second = i;
}
sort (v + 1 , v + n + 1 , cmp);
for (int i = 1 ; i <= n ; i++)
{
int poz = v[i].second - 1;
maxim = 0;
if (poz)
querry (1 , 1 , n , 1 , poz);
val = maxim + 1;
update (1 , 1 , n , poz + 1 , val);
}
g << arb[1] << '\n';
maxim = arb[1];
for (int i = n ; i >= 1 ; i--)
{
if (sol[i] == maxim)
solfin[++cnt] = init[i] , maxim--;
}
for (int i = cnt ; i >= 1 ; i--)
g << solfin[i] <<" ";
return 0;
}