#include <iostream>
#include <fstream>
#include <vector>
#include <algorithm>
#define NM 100000
#define a first
#define b second
#define mp make_pair
using namespace std;
vector<pair<int, int>> v, ai;
int n, p[NM], reconst[NM], ov[NM];
void update(int l, int r, int t, int c, int x, int pz)
{
if(l > r || t < l || t > r)
return;
if(l == r)
ai[c] = mp(x, pz);
else
{
int md = (l+r)/2, nx = c*2;
update(l, md, t, nx, x, pz);
update(md+1, r, t, nx+1, x, pz);
if(ai[nx].a > ai[nx+1].a)
ai[c] = ai[nx];
else
ai[c] = ai[nx+1];
}
}
pair<int, int> query(int l, int r, int tl, int tr, int c)
{
if(tl > r || tr < l)
return mp(0, 0);
if(l >= tl && r <= tr)
return ai[c];
else
{
pair<int, int> x, y;
int md = (l+r)/2, nx = c*2;
x = query(l, md, tl, tr, nx);
y = query(md+1, r, tl, tr, nx+1);
if(x.a > y.a)
return x;
else
return y;
}
}
int main()
{
ifstream f("scmax.in");
ofstream g("scmax.out");
f >> n;
v.resize(n);
ai.resize(n*4);
for(int i = 0; i < n; ++i)
f >> v[i].a, v[i].b = -i,
ov[i] = v[i].a;
sort(v.begin(), v.end());
int mx = 0, mxp;
for(int i = 0; i < n; ++i)
{
pair<int, int> x = query(0, n-1, 0, -v[i].b, 1);
++x.a;
update(0, n-1, -v[i].b, 1, x.a, -v[i].b);
p[-v[i].b] = x.b;
if(mx < x.a)
{
mx = x.a;
mxp = -v[i].b;
}
}
g << mx << '\n';
for(int i = 1, cp = mxp; i <= mx; ++i, cp = p[cp])
reconst[i] = cp;
for(int i = mx; i; --i)
g << ov[reconst[i]] << ' ';
}