#include<bits/stdc++.h>
#define DIM 100001
using namespace std;
ifstream fin("scmax.in");
ofstream fout("scmax.out");
int dp[DIM], v[DIM];
int wmt[4 * DIM];
int n, i, answer, f;
map <int, vector <int>> mp;
map <int, bool> ok;
map <int, bool> :: iterator it;
unordered_map <int, int> nanswer, reverse_answer;
void solve(int pos){
if(!mp[pos].size())
return ;
solve(pos - 1);
fout << reverse_answer[v[mp[pos][mp[pos].size() - 1]]] << " ";
}
void Update(int node, int st, int dr, int a, int b){
if(st == dr)
wmt[node] = max(wmt[node], b);
else {
int mij = (st + dr) >> 1;
if(a <= mij)
Update(node << 1, st, mij, a, b);
if(a > mij)
Update(node << 1 | 1, mij + 1, dr ,a, b);
wmt[node] = max(wmt[node << 1], wmt[node << 1 | 1]);
}
}
int Query(int node, int st, int dr, int a, int b){
if(dr < a || st > b)
return 0;
if(st >= a && dr <= b)
return wmt[node];
else {
int mij = (st + dr) >> 1;
int ok1 = Query(node << 1, st, mij, a, b);
int ok2 = Query(node << 1 | 1, mij + 1, dr, a , b);
return max(ok1, ok2);
}
}
int main(){
fin >> n;
for(i=1;i<=n;i++){
fin >> v[i];
ok[v[i]] = 1;
}
for(it = ok.begin(); it != ok.end(); it++){
nanswer[it -> first] = ++f;
reverse_answer[f] = it -> first;
}
for(i=1;i<=n;i++)
v[i] = nanswer[v[i]];
for(i=1;i<=n;i++){
if(v[i] - 1 >= 1)
dp[i] = Query(1, 1, DIM, 1, v[i] - 1) + 1;
else dp[i] = 1;
Update(1, 1, DIM, v[i], dp[i]);
mp[dp[i]].push_back(i);
}
for(i=1;i<=n;i++)
if(dp[answer] < dp[i])
answer = i;
fout << dp[answer] << "\n";
solve(dp[answer]);
}