#include<fstream>
#include<algorithm>
#include<vector>
#include<string.h>
#include<stack>
using namespace std;
int N;
int v[100010], aib[100010], l[100010], D[100010], up[100010], o[100010], sz;
stack<int> stk;
void update(int x, int v)
{
for (;x <= N;x += x&(-x))
if (D[aib[x]] < D[v])
aib[x] = v;
}
int query(int x)
{
int mx = 0;
for (;x;x -= x&(-x))
if (D[aib[x]]>D[mx])
mx = aib[x];
return mx;
}
FILE *in,*out;
#define DIM 100000
char buff[DIM];
int poz = 0;
void citeste(int &numar)
{
//cat timp caracterul din buffer nu e cifra ignor
while (buff[poz] < '0' || buff[poz] > '9')
//daca am "golit" bufferul atunci il umplu
if (++poz == DIM)
fread(buff, 1, DIM, in), poz = 0;
//cat timp dau de o cifra recalculez numarul
while ('0' <= buff[poz] && buff[poz] <= '9')
{
numar = numar * 10 + buff[poz] - '0';
if (++poz == DIM)
fread(buff, 1, DIM, in), poz = 0;
}
}
int main()
{
in = fopen("scmax.in", "r");
out = fopen("scmax.out", "w");
fread(buff, 1, DIM, in), poz = 0;
citeste(N);
for (int i = 1; i <= N;++i)
{
int numar = 0;
while (buff[poz] < '0' || buff[poz] > '9')
//daca am "golit" bufferul atunci il umplu
if (++poz == DIM)
fread(buff, 1, DIM, in), poz = 0;
//cat timp dau de o cifra recalculez numarul
while ('0' <= buff[poz] && buff[poz] <= '9')
{
numar = numar * 10 + buff[poz] - '0';
if (++poz == DIM)
fread(buff, 1, DIM, in), poz = 0;
}
v[i]=numar, o[i] = l[i] = v[i];
}
sort(v + 1, v + N + 1);
sz = 1;
for (int i = 2;i <= N;++i)
if (v[sz] != v[i])
v[++sz] = v[i];
for (int i = 1;i <= N;++i)
l[i] = lower_bound(v + 1, v + sz + 1, l[i]) - v;
for (int i = 1;i <= N;++i)
{
up[i] = query(l[i]-1);
D[i] = D[up[i]] + 1;
update(l[i], i);
}
int mx = -1, p;
for (int i = 1;i <= N;++i)
if (D[i] > mx)
mx = D[i], p = i;
fprintf(out,"%d\n", D[p]);
while (p)
stk.push(o[p]), p = up[p];
while (stk.size())
fprintf(out,"%d ",stk.top()),stk.pop();
return 0;
}