#include <bits/stdc++.h>
using namespace std;
ifstream fin ("scmax.in");
ofstream fout ("scmax.out");
int v[100005], x[100005];
vector <pair <int, int> > V;
stack <int> s;
int firstDifferent (int n, int val)
{
for (int i = n; i >= 0; i --) {
if (V[i].first != val) return V[i].second;
}
return 0;
}
int binSearch (int s, int e, int val)
{
if (s > e) return -1;
int m = (s + e) / 2;
if (V[m].first == val) return firstDifferent(m - 1, V[m].second);
if (V[m].first < val) return binSearch(m + 1, e, val);
return binSearch(s, m - 1, val);
}
bool cmp (pair <int, int> x, pair <int, int> y) {return x.first < y.first;}
int main()
{
int n;
fin >> n;
int minim = 0x3f3f3f3f;
for (int i = 1; i <= n; i ++) {
fin >> v[i];
V.push_back(pair <int, int> (v[i], i));
if (v[i] < minim) minim = v[i];
}
sort(V.begin(), V.end(), cmp);
x[1] = 1;
int maxim = 0, poz = 0;
for (int i = 2; i <= n; i ++) {
if (v[i] > v[i - 1]) x[i] = x[i - 1] + 1;
else if (v[i] == v[i - 1]) x[i] = x[i - 1];
else x[i] = x[binSearch(0, n - 1, v[i])] + 1;
if (x[i] > maxim) maxim = x[i], poz = i;
}
fout << maxim << "\n";
int i = poz;
while (i > 0) {
s.push(v[i]);
if (v[i] == minim) break;
if (x[i - 1] == x[i]) {
for (int j = i; j > 0; j --) {
if (x[j] != x[i]) {
i = j;
break;
}
}
}
else if (x[i - 1] > x[i]) i = binSearch(0, n - 1, v[i]);
else i --;
}
while (!s.empty()) {
fout << s.top() << " ";
s.pop();
}
return 0;
}