#include<fstream>
#include<stack>
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
ifstream f("scmax.in");
ofstream g("scmax.out");
int V[100005], AINT[400005], Index[100005], Sol[100005];
int n, maxi;
stack <int> S;
void citire()
{
f>>n;
for(int i=1; i<=n; i++)
f>>V[i];
}
void Update(int left, int right, int nod, int pos)
{
int mid = (left + right)/2;
if(left == right){
AINT[nod] = Sol[pos];
return;
}
if(pos <= mid)
Update(left, mid, 2*nod, pos);
else
Update(mid + 1, right, 2*nod + 1, pos);
AINT[nod] = max(AINT[2*nod + 1], AINT[2*nod]);
}
void Query(int st, int fi, int left, int right, int nod)
{
int mid = (left + right)/2;
if(st <= left && right <= fi){
maxi = max(maxi, AINT[nod]);
return;
}
if(st <= mid)
Query(st, fi, left, mid, 2*nod);
if(fi >= mid + 1)
Query(st, fi, mid + 1, right, 2*nod+1);
}
bool Compare(int x, int y)
{
if(V[x] != V[y])
return (V[x] < V[y]);
else
return x > y;
}
void rez()
{
int i, imx, poz, val, el;
for(i=1; i<=n; i++)
Index[i] = i;
sort(Index + 1, Index + n + 1, Compare);
for(i=1; i<=n; i++){
poz = Index[i];
val = V[Index[i]];
maxi = 0;
Query(1, poz, 1, n, 1);
Sol[Index[i]] = maxi + 1;
Update(1, n, 1, Index[i]);
}
maxi = 0;
for(i=1; i<=n; i++){
if(Sol[i] > maxi){
imx = i;
maxi = Sol[i];
}
}
g<<maxi<<"\n";
S.push(imx);
for(i = imx-1; i>0; i--){
if(Sol[i] == (Sol[imx] - 1) && V[i] < V[imx]){
imx = i;
S.push(imx);
}
}
while(!S.empty()){
el = V[S.top()];
S.pop();
g<<el<<" ";
}
g<<"\n";
}
int main()
{
citire();
rez();
return 0;
}