#include <fstream>
#include <vector>
#include <algorithm>
using namespace std;
ifstream fin("scmax.in");
ofstream fout("scmax.out");
int i, n, j,x,p[1000010],ante[1000010],poz,a[1000010];
const int INF = 1e9;
void afisare(int poz, int ante[]) {
if (poz != 0) {
afisare(ante[poz], ante);
fout << a[poz] << " ";
}
}
void lis(int a[]) {
int maxim;
vector<int> d(n + 1, INF);
maxim = d[0] = -INF;
for (int i = 1; i <= n; i++) {
int j = upper_bound(d.begin(), d.end(), a[i]) - d.begin();
if (a[i] != d[j - 1]) {
d[j] = a[i];
p[j] = i;
ante[i] = p[j - 1];
if (j > maxim)
maxim = j, poz = i;
}
}
afisare(poz,ante);
}
int main() {
fin >> n;
for (i = 1; i <= n; i++) {
fin >> a[i];
}
lis(a);
}