#include <fstream>
#include <iostream>
using namespace std;
#define LE 100666
int Tree[LE*5],Scmax[LE],max_left,global_pos;
int bin_search(int value,int left,int right,int A[])
{
if (left==right) return right;
while (left<right)
{
int mid=(left+right+1)/2;
if (A[mid]<=value) left=mid;
else right=mid-1;
}
return right;
}
void update(int left,int right,int nod,int pos)
{
if (left==right)
{
Tree[nod]=pos;
return;
}
int mid=(left+right)/2;
if (pos<=mid) update(left,mid,nod*2,pos);
else update(mid+1,right,nod*2+1,pos);
if (Scmax[Tree[nod*2]]>Scmax[Tree[nod*2+1]])
Tree[nod]=Tree[nod*2];
else
Tree[nod]=Tree[nod*2+1];
}
void query(int left,int right,int nod,int X,int Y)
{
if (left>=X&&right<=Y)
{
if (Scmax[Tree[nod]]>max_left) max_left=Scmax[Tree[nod] ],global_pos=Tree[nod];
return;
}
int mid=(left+right)/2;
if (X<=mid) query(left,mid,nod*2,X,Y);
if (mid+1<=Y) query(mid+1,right,nod*2+1,X,Y);
}
ifstream f("scmax.in");
ofstream g("scmax.out");
#include <algorithm>
int a[LE],b[LE],last_pos[LE];
void Write(int pos)
{
if (pos==0) return;
Write(last_pos[pos]);
g<<a[pos]<<" ";
}
int main()
{
int i,n;
f>>n;
for(i=1; i<=n; ++i)
{
f>>a[i];
b[i]=a[i];
}
sort(b+1,b+n+1);
for(i=1; i<=n; ++i) a[i]=bin_search(a[i],1,n,b);
//for(i=1;i<=n;++i) cout<<a[i]<<" ";
//cout<<'\n'<<'\n';
for(i=1; i<=n; ++i)
{
max_left=0;
if (a[i]-1!=0)
query(1,n,1,1,a[i]-1);
Scmax[i]=Scmax[global_pos]+1;
last_pos[i]=global_pos;
update(1,n,1,i);
// cout<<"("<<i<<","<<max_left<<","<<Scmax[i]<<") "<<'\n';
}
// cout<<'\n';
int val_result=0,ind=0;
for(i=1; i<=n; ++i)
if (Scmax[i]>val_result)
val_result=Scmax[i],ind=i;
g<<val_result<<'\n';
Write(ind);
return 0;
}