#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), vv(N);
int pos = 0;
map < int, int > h;
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];
vv[i] = v[i];
}
sort(vv.begin() + 1, vv.begin() + 1 + n);
for (int i = 1; i <= n; i++) {
if (vv[i] != vv[i - 1]) {
pos++;
ind1[pos] = vv[i];
h[vv[i]] = pos;
}
}
for (int i = 1; i <= n; i++) {
pair < int, int > fnd_mx = query(1, 1, n, 1, h[v[i]] - 1);
if (fnd_mx.first + 1 > mx.first) {
mx.first = fnd_mx.first + 1;
mx.second = h[v[i]];
}
p[h[v[i]]] = fnd_mx.second;
update(1, 1, n, h[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;
}