#include <cstdio>
#include <algorithm>
#define infile "scmax.in"
#define outfile "scmax.out"
#define n_max 100005
using namespace std;
int lst[n_max], v[n_max], a[n_max], prev[n_max], Lg[n_max];
int AI[3*n_max];
int bst;
int N;
void update(int nod, int st, int dr, int poz, int x)
{
if(st == dr)
{
AI[nod] = x;
return;
}
int mij = st + (dr-st)/2;
if(poz <= mij)
update(2*nod, st, mij, poz, x);
else
update(2*nod+1, mij+1, dr, poz, x);
if(Lg[AI[2*nod]] > Lg[AI[2*nod+1]])
AI[nod] = AI[2*nod];
else
AI[nod] = AI[2*nod+1];
}
void query(int nod, int st, int dr, int a, int b, int &rez)
{
if(a > b)
return;
if(a<=st && dr<=b)
{
if(Lg[AI[nod]] > Lg[rez])
rez = AI[nod];
return;
}
int mij = st + (dr - st)/2;
if(a <= mij)
query(2*nod, st, mij, a, b, rez);
if(mij < b)
query(2*nod+1, mij+1, dr, a, b, rez);
}
void citeste()
{
freopen(infile, "r", stdin);
scanf("%d", &N);
for (int i = 1; i <= N; ++i)
{
scanf("%d", &a[i]);
v[i] = lst[i] = a[i];
}
fclose(stdin);
}
void rezolva()
{
int i;
sort(lst+1,lst+N+1);
for (i = 2, lst[0] = 1; i <= N; ++i)
if (lst[i] != lst[lst[0]])
lst[++lst[0]] = lst[i];
for (i = 1; i <= N; ++i)
v[i] = lower_bound(lst+1, lst+lst[0]+1, v[i])-lst;
for(i=1;i<=N;i++)
{
query(1, 1, N, 1, v[i]-1, prev[i]);
Lg[i] = Lg[prev[i]] + 1;
update(1, 1, N, v[i], i);
}
for(i=1, bst=1;i<=N;i++)
if(Lg[i] > Lg[bst])
bst = i;
lst[0] = 0;
for(i = bst; i; i = prev[i])
lst[++lst[0]] = a[i];
}
void afiseaza()
{
freopen(outfile, "w", stdout);
printf("%d\n", Lg[bst]);
for(int i=lst[0];i;i--)
printf("%d ",lst[i]);
fclose(stdout);
}
int main(void)
{
citeste();
rezolva();
afiseaza();
return 0;
}