#include <iostream>
#include <fstream>
#include <algorithm>
#define NMAX 100003
using namespace std;
ifstream fin("scmax.in");
ofstream fout("scmax.out");
struct elem{
int val, pos;
}v[NMAX + 5];
int BITree[NMAX + 5], n, parent[NMAX + 5], best[NMAX + 5], ans_list[NMAX + 5];
bool cmp(elem a, elem b){
if(a.val == b.val){
return a.pos > b.pos;
}
return a.val < b.val;
}
int Query(int pos){
int i, ans = 0;
for(i = pos; i > 0; i -= i & (-i)){
if(best[BITree[i]] > best[ans]) ans = BITree[i];
}
return ans;
}
void Update(int pos, int val){
int i;
for(i = pos; i <= n; i += i & (-i)){
if(best[BITree[i]] < best[val]) BITree[i] = val;
}
}
int main ()
{
int i, last_elem, cnt = 0;
fin>>n;
for(i = 1; i <= n; ++i){
fin>>v[i].val;
v[i].pos = i;
}
sort(v + 1, v + 1 + n, cmp);
for(i = 1; i <= n; ++i){
parent[i] = Query(v[i].pos - 1);
best[i] = best[parent[i]] + 1;
Update(v[i].pos, i);
}
last_elem = Query(n);
fout<< best[last_elem] << "\n";
while(parent[last_elem] != 0){
ans_list[++cnt] = last_elem;
last_elem = parent[last_elem];
}
ans_list[++cnt] = last_elem;
if(best[last_elem] != 0){
for(i = cnt; i > 0; --i){
fout<< v[ans_list[i]].val << " ";
}
}
return 0;
}