#include <fstream>
#include <algorithm>
#include <vector>
using namespace std;
ifstream cin ("scmax.in");
ofstream cout ("scmax.out");
int v[100005],tata[100005],indici[100005],sol[100005];
int main() {
int n;
cin>>n;
for (int i=1; i<=n; ++i) {
cin>>v[i];
}
vector<int> minsol;
int lmax=0;
for (int i=1; i<=n; ++i) {
auto it=lower_bound(minsol.begin(),minsol.end(),v[i]);
int poz=distance(minsol.begin(),it);
if (it==minsol.end()) {
minsol.push_back(v[i]);
}
else {
*it=v[i];
}
indici[poz]=i;
if (poz>0) {
tata[i]=indici[poz-1];
}
else {
tata[i]=0;
}
if (poz+1>lmax) {
lmax=poz+1;
}
}
cout<<lmax<<"\n";
int curr=indici[lmax-1],k=0;
while (curr!=0) {
sol[k++]=v[curr];
curr=tata[curr];
}
for (int p=k-1; p>=0; --p) {
cout<<sol[p]<<" ";
}
return 0;
}