#include <fstream>
#include <vector>
#include <algorithm>
using namespace std;
int n;
vector<int> AIB;
vector<int> D;
void update(int val, int index){
for(;val<=n;val+=val&(-val))
if(D[index]>D[AIB[val]])
AIB[val]=index;
}
int query(int val){
int mx=0;
for(;val;val-=val&(-val))
if(D[AIB[val]]>D[mx])
mx=AIB[val];
return mx;
}
int main(){
ifstream fin("scmax.in");
ofstream fout("scmax.out");
fin>>n;
vector<int> v(n+1);
vector<int> increasing(n+1); increasing[0]=0;
AIB.resize(n+1,0);
D.resize(n+1,0);
for(int i=1;i<=n;++i){
fin>>v[i];
increasing[i]=v[i];
}
sort(increasing.begin(),increasing.end());
/*int h=1;
for(int i=2;i<=n;++i)
if(increasing[i]!=increasing[h])
increasing[++h]=increasing[i];*/
for(int i=0;i<=n;++i)
//v[i]=lower_bound(increasing.begin()+1,increasing.begin()+h+1,v[i])-increasing.begin();
v[i]=lower_bound(increasing.begin(),increasing.end(),v[i])-increasing.begin();
vector<int> up(n+1);
for(int i=1;i<=n;++i){
up[i]=query(v[i]-1);
D[i]=D[up[i]]+1;
update(v[i],i);
}
unsigned bst=0;
for(int i=1;i<=n;++i)
if(D[bst]<D[i]) bst=i;
int mx=D[bst];
fout<<mx<<'\n';
for(int i=1;i<=mx;++i){
D[i]=increasing[v[bst]];
bst=up[bst];
}
for(int i=mx;i;--i) fout<<D[i]<<' ';
fout<<'\n';
}