#include <bits/stdc++.h>
using namespace std;
const int N = 100050;
ifstream in("scmax.in");
ofstream out("scmax.out");
vector < pair < int, int > > ST(N * 4 + 5, {0, 0});
vector < int > v(N), ind1(N + 5);
map < int, int > ind;
set < int > s;
int pos = 0;
vector < int > p(N, 0), ans;
pair < int, int > mx = {-2e9, 0};
pair < int, int > MAX(pair <int, int > a, pair <int,int> b) {
if (a.first > b.first) {
return a;
}
if (b.first > a.first) {
return b;
}
return a;
}
pair < int, int > query(int node, int l, int r, int st, int dr) {
if (l >= st && r <= dr) {
return ST[node];
}
if (st > r || dr < l) {
return {0, 0};
}
int mid = (l + r) / 2;
return MAX(query(node * 2, l, mid, st, dr), query(node * 2 + 1, mid + 1, r, st, dr));
}
void update(int node, int l, int r, int pos, int val) {
if (l > pos || pos > r) {
return;
}
if (l == r) {
ST[node].first = val;
ST[node].second = pos;
return;
}
int mid = (l + r) / 2;
update(2 * node, l, mid, pos, val);
update(2 * node + 1, mid + 1, r, pos, val);
ST[node] = MAX(ST[node * 2], ST[node * 2 + 1]);
}
int main() {
int n;
in >> n;
for (int i = 1; i <= n; i++) {
in >> v[i];
s.insert(v[i]);
}
for (auto it : s) {
pos++;
ind[it] = pos;
ind1[pos] = it;
}
for (int i = 1; i <= n; i++) {
pair < int, int > fnd_mx = query(1, 1, n, 1, ind[v[i]] - 1);
if (fnd_mx.first + 1 > mx.first) {
mx.first = fnd_mx.first + 1;
mx.second = ind[v[i]];
}
p[ind[v[i]]] = fnd_mx.second;
update(1, 1, n, ind[v[i]], fnd_mx.first + 1);
}
out << mx.first << "\n";
while(mx.second) {
ans.push_back(mx.second);
mx.second = p[mx.second];
}
reverse(ans.begin(), ans.end());
for (auto it : ans) out << ind1[it] << " ";
return 0;
}