#include<fstream>
#include <set>
#include<vector>
#include <unordered_map>
#define NMAX 100010
#define lsb(x) (x&(-x))
using namespace std;
int a[NMAX];
int a2[NMAX];
int a3[NMAX];
int aib[NMAX];
int n;
ifstream f("scmax.in");
ofstream g("scmax.out");
void compressCoord()
{
set<int> s;
for (int i = 1; i <= n; i++)
s.insert(a[i]);
unordered_map<int, int> hmap;
int idx = 0;
for (auto it : s)
{
idx++;
hmap[it]=idx;
}
for (int i = 1; i <= n; i++)
a2[i] = hmap[a[i]];
}
int query(int index)
{
int ans = 0;
for (int i = index; i > 0; i -= lsb(i))
ans = max(aib[i], ans);
return ans;
}
void update(int index)
{
int x = query(index - 1);
for (int i = index; i <= n; i += lsb(i))
aib[i] = max(aib[i], x + 1);
}
int main()
{
f >> n;
for (int i = 1; i <= n; i++)
f >> a[i];
compressCoord();
for (int i = 1; i <= n; i++)
{
update(a2[i]);
}
int hmax = query(n);
vector<int> sol;
for (int i = n; i >= 1; i--)
{
if (query(a2[i]) == hmax)
{
hmax--;
sol.push_back(i);
}
}
reverse(begin(sol), end(sol));
g << query(n) << '\n';
for (auto it : sol)
g << a[it] << " ";
}