#include<cstdio>
#include<malloc.h>
#include<algorithm>
#define zeros(x) ((x)&(-x))
using namespace std;
void update(int *aib, int *values, int n, int i, int ind)
{
for(; i <= n; i += zeros(i))
if(values[ind] > values[aib[i]])
aib[i] = ind;
}
int query(int *aib, int *values, int ind)
{
int max = 0;
for(int i = ind; i > 0; i-=zeros(i))
if(values[aib[i]] > values[max])
max = aib[i];
return max;
}
void afisSol(int *prev, int *sortedSir, int *sir, int current)
{
if(prev[current])
afisSol(prev, sortedSir, sir, prev[current]);
printf("%d ", sortedSir[sir[current]]);
}
int main()
{
freopen("scmax.in", "r", stdin);
freopen("scmax.out", "w", stdout);
int *sir, *sortedSir, *aib, *pos, *val, *prec;
int n, nSorted = 0, maxx = 1;
scanf("%d", &n);
sir = new int[n + 1];
sortedSir = new int[n + 1];
pos = new int[n + 1];
val = (int*) calloc(n + 1, sizeof(int));
aib = (int*) calloc(n + 1, sizeof(int));
prec = (int*) calloc(n + 1, sizeof(int));
for(int i = 1; i <= n; i++)
{
scanf("%d", sir + i);
sortedSir[i] = sir[i];
}
sort(sortedSir + 1, sortedSir + n + 1);
for(int i = 1; i <= n; i++)
if(sortedSir[i] != sortedSir[i - 1])
sortedSir[++nSorted] = sortedSir[i];
for(int i = 1; i <= n; i++)
sir[i] = lower_bound(sortedSir + 1, sortedSir + nSorted, sir[i]) - sortedSir;
for(int i = 1; i <= n; i++)
{
prec[i] = query(aib, val, sir[i] - 1);
val[i] = val[prec[i]] + 1;
if(val[i] > val[maxx])
maxx = i;
update(aib, val, n, sir[i], i);
}
printf("%d\n", val[maxx]);
afisSol(prec, sortedSir, sir, maxx);
puts("");
return 0;
}