#include <bits/stdc++.h>
using namespace std;
const int nmax = 100000;
const int amax = 1 << 17;
int v[1+nmax];
int aint[amax+1];
int dp[1+nmax];
int init[1+nmax];
stack<int> s;
struct normalizare
{
int val,poz;
bool operator< (normalizare other) const{
return val < other.val;
}
} aux[1+nmax];
void update(int p,int x,int nod,int st,int dr)
{
if(st == dr)
{
aint[nod] = max(aint[nod],x);
return;
}
int mid = (st+dr)/2;
if(p <= mid)
update(p,x,nod*2,st,mid);
else
update(p,x,nod*2+1,mid+1,dr);
aint[nod] = max(aint[nod*2],aint[nod*2+1]);
}
int query(int x,int nod,int st,int dr)
{
if(st == dr)
return 0;
else
{
int mid = (st+dr)/2;
if(x <= mid)
return query(x,nod*2,st,mid);
else
return max(aint[nod*2],query(x,nod*2+1,mid+1,dr));
}
}
int main()
{
freopen("scmax.in","r",stdin);
freopen("scmax.out","w",stdout);
int n;
cin >> n;
for(int i = 1;i <= n;i ++)
{
cin >> v[i];
aux[i].val = v[i];
aux[i].poz = i;
init[i] = v[i];
}
sort(aux+1,aux+n+1);
int ind = 0;
for(int i = 1;i <= n;i ++)
{
if(aux[i].val != aux[i-1].val)
ind ++;
v[aux[i].poz] = ind;
}
dp[1] = 1;
update(v[1],dp[1],1,1,amax);
int sol = dp[1];
int l;
for(int i = 2;i <= n;i ++)
{
dp[i] = query(v[i],1,1,amax) + 1;
update(v[i],dp[i],1,1,amax);
if(dp[i] > sol)
{
sol = dp[i];
l = i;
}
}
s.push(init[l]);
for(int i = l-1;i >= 1;i --)
{
if(v[i] < v[l])
{
l = i;
s.push(init[l]);
}
}
cout << sol << "\n";
while(s.size() > 0)
{
cout << s.top() << " ";
s.pop();
}
return 0;
}