#include <fstream>
#include <algorithm>
using namespace std;
ifstream cin ("scmax.in");
ofstream cout ("scmax.out");
struct ura{
int poz, val;
} v[100005];int ans[100005];
int seg[400005];
bool cmp(ura a, ura b)
{
if (a.val != b.val)
return a.val < b.val;
return a.poz < b.poz;
}
void update(int nod, int l, int r, int poz, int val)
{
if (l == r)
seg[nod] = val;
else
{
int mid = (l + r) / 2;
if (poz <= mid)
update(nod * 2, l, mid, poz, val);
else
update(2 * nod + 1, mid + 1, r, poz, val);
seg[nod] = max(seg[2 * nod], seg[2 * nod + 1]);
}
}
int query(int nod, int l, int r, int ql, int qr)
{
if (l >= ql && r <= qr)
return seg[nod];
int mid = (l + r) / 2, maxi = 0;
if (ql <= mid)
maxi = max(maxi, query(nod * 2, l, mid, ql, qr));
if (qr > mid)
maxi = max(maxi, query(nod * 2 + 1, mid + 1, r, ql, qr));
return maxi;
}
int sol[100005];
int main()
{
int n, i;
cin >> n;
for (i = 1; i <= n; i++)
cin >> v[i].val, v[i].poz = i;
sort (v + 1, v + n + 1, cmp);
for (i = 1; i <= n; i++)
{
int j = i;
while (j < n && v[j + 1].val == v[j].val)
j++;
int jj = j;
while (j >= i)
{
if (v[j].poz == 1)
ans[v[j].poz] = 1;
else
ans[v[j].poz] = query(1, 1, n, 1, v[j].poz - 1) + 1;
update(1, 1, n, v[j].poz, ans[v[j].poz]);
j--;
}
i = jj;
}
cout << query(1, 1, n, 1, n) << '\n';
int k = 0, l = query(1, 1, n, 1, n);
i = n;
while (i && query(1, 1, n, v[i].poz, v[i].poz) != l)
i--;
sol[l] = v[i].val;
while (l > 1)
{
if (v[i].val < sol[l] && query(1, 1, n, v[i].poz, v[i].poz) + 1 == l)
{
l--;
sol[l] = v[i].val;
}
i--;
}
l = query(1, 1, n, 1, n);
for (i = 1; i <= l; i++)
cout << sol[i] << " ";
return 0;
}