#include <fstream>
#include <map>
#define nm 131072
using namespace std;
ifstream fin("scmax.in");
ofstream fout("scmax.out");
int E[nm];
int P[nm];
int T[nm * 4];
map<int, int> M;
inline int maxf(int a, int b) {
return (a > b? a: b);
}
void _update(int n, int v, int l, int r, int k) {
/*if (v <= l) {
T[n] = maxf(k, T[n]);
} else {
int m = (l + r) >> 1;
if (v <= m) {
_update(n << 1, v, l, m, k);
}
_update(n << 1 | 1, v, m + 1, r, k);
}*/
}
int _query(int n, int v, int l, int r) {
/*if (v <= l) {
return T[n];
} else {
int m = (l + r) >> 1;
if (v <= m) {
return maxf(T[n], _query(n << 1, v, l, m));
} else {
return maxf(T[n], _query(n << 1 | 1, v, m + 1, r));
}
}*/
return 1;
}
void back(int p) {
/*if (p > 0) {
int i;
for (i = p - 1; i > 0 && !(E[i] < E[p] && P[i] + 1 == P[p]); --i);
back(i);
fout << E[p] << ' ';
}*/
}
int main() {
int N, i, l, v, k, p, maxe, pmax;
map<int, int>::iterator j;
fin >> N;
// populate structures
for (i = 1, maxe = 0; i <= N; ++i) {
fin >> v;
E[i] = v;
M.insert(pair<int, int>(v, 0));
}
// create positions
for (j = M.begin(), i = 1; j != M.end(); ++j, ++i) {
j->second = i;
}
// update
for (--i, l = 1; l <= N; ++l) {
// get this position
k = M.find(E[l])->second;
// get pair
p = _query(1, k, 1, i);
// update this length
_update(1, k + 1, 1, i, P[l] = 1 + p);
if (P[l] > maxe) {
maxe = P[l];
pmax = l;
}
}
fout << maxe << '\n';
back(pmax);
fin.close();
fout.close();
return 0;
}