#include <fstream>
#include <climits>
std::ofstream cout("scmax.out");
const int nmax=1e5;
int v[4+nmax],dp[4+nmax],next[4+nmax],n;
struct arb3
{
int nr,ind;
}arb[4+4*nmax];
bool operator <(arb3 x,arb3 y)
{
if(x.nr>y.nr)
return 0;
if(x.nr==y.nr)
return (x.ind<y.ind);
return 1;
}
void read()
{
std::ifstream cin("scmax.in");
cin>>n;
for(int i=1;i<=n;i++)
cin>>v[i];
cin.close();
}
void build(int left,int right,int node)
{
if(left==right)
arb[node].ind=right;
else
{
int node_left=2*node,node_right=node_left+1,mid=(right+left)>>1;
build(left,mid,node_left);
build(mid+1,right,node_right);
}
}
void update(int left,int right,int node,int x,int val)
{
if(right==left)
{
arb[node].nr=val;
return;
}
int node_left=2*node,node_right=node_left+1,mid=(left+right)>>1;
if(x<=mid)
update(left,mid,node_left,x,val);
else
update(1+mid,right,node_right,x,val);
arb[node].nr=std::max(arb[node_left].nr,arb[node_right].nr);
}
arb3 max_arb(int left,int right,int node,int left_limit,int right_limit,int val)
{
if(left==right)
{
if(v[arb[node].ind]>val)
return arb[node];
return {0,0};
}
int next_node_left=2*node,next_node_right=next_node_left+1,mid=(left+right)>>1;
arb3 sol={0,0};
if(left_limit<=mid)
sol=std::max(sol,max_arb(left,mid,next_node_left,left_limit,right_limit,val));
if(right_limit>mid)
sol=std::max(sol,max_arb(1+mid,right,next_node_right,left_limit,right_limit,val));
return sol;
}
void solve()
{
build(1,n,1);
for(int i=n;i>0;--i)
{
arb3 aux=max_arb(1,n,1,i+1,n,v[i]);
dp[i]=1+aux.nr;
next[i]=aux.ind;
update(1,n,1,i,dp[i]);
}
int maxi=INT_MIN,p_maxi=0;
for(int i=1;i<=n;i++)
{
if(dp[i]>maxi)
{
maxi=dp[i];
p_maxi=i;
}
}
cout<<maxi<<'\n';
while(p_maxi)
{
cout<<v[p_maxi]<<' ';
p_maxi=next[p_maxi];
}
}
int main()
{
read();
solve();
return 0;
}