#include <fstream>
#include <algorithm>
using namespace std;
ifstream f("scmax.in");
ofstream g("scmax.out");
pair < int , int > v[600005];
int n , i , maxim , poz , cnt;
int init[100005] , best[600005] , best1[600005] , b[100005];
bool cmp (pair <int , int > a , pair <int , int > 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)
{
best[nod] = val;
best1[poz] = val;
return;
}
int mij = (left + right) / 2;
if (poz <= mij)
update (2 * nod , left , mij , poz , val);
else
if (poz > mij)
update (2 * nod + 1 , mij + 1 , right , poz , val);
best[nod] = max (best[2 * nod] , best[2 * nod + 1]);
}
void querry (int nod , int left , int right , int ql , int qr)
{
if (ql <= left && qr >= right)
{
maxim = max (maxim , best[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 (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++)
{
maxim = 0;
int left = v[i].second - 1;
int right = 1;
if(right <= left)
querry(1 , 1 , n , right , left);
int val = maxim + 1;
int poz = v[i].second;
update(1 , 1 , n , poz , val);
}
g << best[1] << '\n';
maxim = 0;
for (i = 1 ; i <= n ; i++)
{
if (best1[i] >= maxim)
{
maxim = best1[i];
poz = init[i] ;
}
}
for (int i = n ; i >= 1 ; i--)
{
if (best1[i] == maxim && init[i] <= poz)
{
cnt++;
b[cnt] = init[i];
maxim--;
poz = init[i];
}
}
for(i = cnt ; i >= 1 ; i--)
g << b[i] << " ";
return 0;
}