#include <iostream>
#include <fstream>
#include <iomanip>
using namespace std;
#define dim 100001
#define infinit 2<<28
void citeste(ifstream &f, int *&v, int *&subsir, int *&pozitii, int &n)
{
f >> n;
//cout << "n = " << n << endl;
v = new int[n + 1];
subsir = new int[n + 1];
pozitii = new int[n + 1];
for(int i = 1; i <= n; ++i)
f >> v[i];
}
int inserare_binara(int ce_adaug, int *unde_adaug, int &lung, int st, int dr)
{
int mij = (st + dr) / 2;
if(st == dr)
{
if(dr > lung)
{
++lung;
unde_adaug[dr] = ce_adaug;
unde_adaug[lung+1] = infinit;
//return st;
}
else
{
unde_adaug[st] = ce_adaug;
}
return st;
}
else
if(ce_adaug <= unde_adaug[mij])
return inserare_binara(ce_adaug, unde_adaug, lung, st, mij);
else
return inserare_binara(ce_adaug, unde_adaug, lung, mij + 1, dr);
}
void dinamica(int *v, int n, int *subsir, int *pozitii, int &lung)
{
lung = 0;
subsir[1] = infinit;
for(int i = 1; i <= n; ++i)
pozitii[i] = inserare_binara(v[i], subsir, lung, 1, lung + 1);
}
void construieste_solutia(int *&solutie,int *v, int *pozitii, int lung, int n)
{
int i = lung, j = n;
solutie = new int[lung + 1];
while(i > 0)
{
while(pozitii[j] != i)
--j;
solutie[i] = v[j];
--i;
}
}
void scrie_solutie(ofstream &fis, int *vct, int lung)
{
for(int i = 1; i <= lung; ++i)
fis << setw(4) << vct[i];
fis<<"\n";
}
int main()
{
ifstream f("scmax.in");
ofstream g("scmax.out");
int *v, *subsir, *pozitii, *solutie, n, lung;
citeste(f, v, subsir, pozitii, n);
//g << "am citit vct : " << endl;
//scrie_solutie(g, v, n);
dinamica(v, n, subsir, pozitii, lung);
construieste_solutia(solutie, v, pozitii, lung, n);
//scrie_solutie(g, solutie, lung);
//scrie_solutie(g, pozitii, n);
//scrie_solutie(g, subsir, lung);
g<<lung<<"\n";
for(int i=1; i<=lung; ++i) g<<solutie[i]<<" ";
f.close();
g.close();
return 0;
}