#include <iostream>
#include <cstdio>
#include <algorithm>
#define NMax 100005
using namespace std;
int N, V[NMax], Index[NMax], Initial[NMax];
int AI[3*NMax], DP[NMax], F[NMax];
inline int Max (int a, int b)
{
if (a>b)
{
return a;
}
return b;
}
void Update (int K, int L, int R, int X, int Y)
{
int Mid=(L+R)/2;
if (L==R)
{
AI[K]=Y;
return;
}
if (X<=Mid)
{
Update (2*K, L, Mid, X, Y);
}
else
{
Update (2*K+1, Mid+1, R, X, Y);
}
AI[K]=Max (AI[2*K], AI[2*K+1]);
}
int Query (int K, int L, int R, int QL, int QR)
{
int Mid=(L+R)/2;
if (QL<=L and R<=QR)
{
return AI[K];
}
int AnswerL=0, AnswerR=0;
if (QL<=Mid)
{
AnswerL=Query (2*K, L, Mid, QL, QR);
}
if (QR>Mid)
{
AnswerR=Query (2*K+1, Mid+1, R, QL, QR);
}
return Max (AnswerL, AnswerR);
}
inline bool Compare (int i, int j)
{
if (V[i]<V[j])
{
return true;
}
return false;
}
void Normalize ()
{
sort (Index+1, Index+N+1, Compare);
int CurrentV=0, X=-1;
for (int i=1; i<=N; ++i)
{
if (V[Index[i]]!=X)
{
++CurrentV;
}
X=V[Index[i]];
V[Index[i]]=CurrentV;
}
}
void LIS ()
{
for (int i=1; i<=N; ++i)
{
if (V[i]==1)
{
DP[i]=1;
}
else
{
DP[i]=Query (1, 1, V[Index[N]], 1, V[i]-1)+1;
}
Update (1, 1, V[Index[N]], V[i], DP[i]);
for (int j=i-1; j>0; --j)
{
if (V[j]<V[i] and DP[j]+1==DP[i])
{
F[i]=j;
break;
}
}
}
}
void Read ()
{
freopen ("scmax.in", "r", stdin);
scanf ("%d", &N);
for (int i=1; i<=N; ++i)
{
scanf ("%d", &V[i]);
Index[i]=i;
Initial[i]=V[i];
}
}
void P (int i)
{
if (F[i]==0)
{
printf ("%d ", Initial[i]);
return;
}
P (F[i]);
printf ("%d ", Initial[i]);
}
void Print ()
{
freopen ("scmax.out", "w", stdout);
printf ("%d\n", AI[1]);
for (int i=N; i>0; --i)
{
if (DP[i]==AI[1])
{
P (i);
return;
}
}
}
int main()
{
Read ();
Normalize ();
LIS ();
Print ();
return 0;
}