#include<fstream>
#include<iostream>
#include<algorithm>
#include<cmath>
#include<climits>
#include<iomanip>
#include<cstring>
#include<bitset>
#define MAX 100000
using namespace std;
ifstream f("scmax.in");
ofstream g("scmax.out");
//ifstream f("in.in");
//ofstream g("out.out");
int p[MAX+5],A[4*MAX+5],n;
int best;
struct sct{
int val;
int poz;
}v[MAX+5],s[MAX+5];
void update(int nod,int st,int dr,int poz,int x){
if(st==dr){
A[nod] = x;
}else{
int mid = (st+dr)/2;
if(poz<=mid){
update(2*nod,st,mid,poz,x);
}else{
update(2*nod+1,mid+1,dr,poz,x);
}
A[nod] = max(A[nod*2],A[nod*2+1]);
}
}
void query(int nod,int st,int dr,int a,int b){
//cout<<nod<<" "<<st<<" "<<dr<<'\n';
if(a<=st && dr<=b){
best = max(best,A[nod]);
}else{
int mid = (st+dr)/2;
if(a<=mid){
query(2*nod,st,mid,a,b);
}
if(mid+1<=b){
query(2*nod+1,mid+1,dr,a,b);
}
}
}
bool cmp(sct a,sct b){
if(a.val<b.val){
swap(v[a.poz].poz,v[b.poz].poz);
return 1;
}else if(a.val == b.val && a.poz < b.poz){
swap(v[a.poz].poz,v[b.poz].poz);
return 1;
}
return 0;
}
int maxi = -1,maxiPoz;
void afisare(int x){
if(p[x] != 0){
afisare(p[x]);
}
g<<s[x].val<<" ";
}
int main(){
f>>n;
for(int i=1;i<=n;i++){
f>>v[i].val;
v[i].poz = i;
s[i].val = v[i].val;
s[i].poz = i;
}
sort(s+1,s+n+1,cmp);
/*for(int i=1;i<=n;i++){
cout<<v[i].val<<"-"<<v[i].poz<<" ";
}
cout<<'\n';
for(int i=1;i<=n;i++){
cout<<s[i].val<<"-"<<s[i].poz<<" ";
}
cout<<'\n'<<'\n';*/
for(int i=1;i<=n;i++){
///cautam binar in s cel mai mare numar mai mic decat v[i]
int st=1,dr=n,mid,poz = 0;
while(st<=dr){
mid = (st+dr)/2;
if(s[mid].val < v[i].val){
poz = mid;
st = mid+1;
}else{
dr = mid-1;
}
}
best = 0;
if(poz != 0){
query(1,1,n,1,poz);
}
update(1,1,n,v[i].poz,best+1);
p[v[i].poz] = poz;
if(maxi < best+1){
maxi = best+1;
maxiPoz = v[i].poz;
}
//cout<<poz<<" "<<best+1<<'\n';
}
g<<maxi<<'\n';
afisare(maxiPoz);
f.close();
g.close();
return 0;
}