// Subsir crescator maximal - O(NlogN)
// last[i] - pozitia pe care s-a incheiat ultimul sir crescator de lungime i
// ante[i] = nodul anterior din scmaxul unde v[i] e capatul dreapta
#include<fstream>
#define Nmax 100099
using namespace std;
ifstream f("scmax.in");
ofstream g("scmax.out");
int N, v[Nmax], L, last[Nmax], ante[Nmax];
void SCMAX() {
L = 1; // lungimea maxima gasita
last[1] = 1; // ultimul sir maximal de lungime 1 s-a incheiat pe poz 1
for (int i = 2; i <= N; ++i) {
int st = 1, dr = L;
while (st <= dr) {
int mij = (st + dr) >> 1;
if (v[i] > v[last[mij]]) { // v[i] poate extinde SIGUT sirul care se terminca cu v[ last[ mij] ] , poate chiar mai mult
st=mij+1;
} else { // v[i] trebuie sa extinda un sir al carui termen maxim e mai mare decat v[ last[ mij] ]
dr=mij-1;
}
}
if (st == L+1) {
++L; // am o noua solutie!
}
last[st] = i;
ante[i] = last[st-1];
}
}
void Build(int poz) {
if (ante[poz]) {
Build(ante[poz]);
}
g << v[poz] << ' ';
}
int main () {
f >> N;
for (int i = 1; i <= N; ++i) {
f >> v[i];
}
SCMAX();
g << L << '\n';
Build(last[L]);
return 0;
}