#include<fstream>
#include<algorithm>
#include <vector>
#define NMAX 100010
using namespace std;
using ll = long long;
ll t[4 * NMAX];
pair<int,ll> v[NMAX];
int v1[NMAX];
int d[NMAX];
int n;
ifstream f("scmax.in");
ofstream g("scmax.out");
int query(int u, int l, int r, int ql, int qr)
{
if (l > qr || r < ql)
return 0;
if (l >= ql && r <= qr)
return t[u];
int m = (l + r) / 2;
return max(query(u << 1, l, m, ql, qr), query(u << 1 | 1, m + 1, r, ql, qr));
}
void build(int u, int l, int r, int pos, int val)
{
if (l == r)
{
t[u] = val;
return;
}
if (pos<l || pos>r)
return;
int m = (l + r) / 2;
build(u << 1, l, m, pos, val);
build(u << 1|1, m+1, r, pos, val);
t[u] = max(t[u << 1], t[u << 1 | 1]);
}
int main()
{
f >> n;
for (int i = 1; i <= n; i++)
f >> v[i].first, v[i].second = i,v1[i]=v[i].first;
sort(v + 1, v + n + 1, [](pair<int, ll> a, pair<int, ll> b) {
if (a.first == b.first)
return a.second > b.second;
return a.first < b.first;
});
int hmax=-1;
int poz=-1;
for (int i = 1; i <= n; i++)
{
int val = query(1,1, n, 1, v[i].second-1) + 1;
build(1, 1, n, v[i].second, val);
if (val > hmax)
{
hmax = val;
poz = v[i].second;
}
d[v[i].second] = val;
}
vector<int> sol;
for(int i=poz;i>=1;i--)
if (d[i] == hmax)
{
sol.push_back(i);
hmax--;
}
g << t[1]<<'\n';
for (int i = sol.size() - 1; i >= 0; i--)
g << v1[sol[i]] << " ";
}