#include <cstdio>
#include <algorithm>
#define fs (node << 1)
#define fd ((node << 1) + 1)
using namespace std;
const int INF = 1 << 30;
const int maxn = 524288 * 2;
int aint[maxn + 2], N;
inline int min(int a, int b) {
if(a < b) return a;
return b;
}
void build_tree(int node, int lf, int rt) {
if(lf == rt) {
aint[node] = INF;
return ;
}
int mid = (lf + rt) >> 1;
build_tree(fs, lf, mid);
build_tree(fd, mid + 1, rt);
}
void update(int node, int lf, int rt, int pos, int val) {
if(lf == rt) {
aint[node] = val;
return ;
}
int mid = (lf + rt) >> 1;
if(pos <= mid) update(fs, lf, mid, pos, val);
if(pos > mid) update(fd, mid + 1, rt, pos, val);
aint[node] = min(aint[fs], aint[fd]);
}
void rear(int node, int lf, int rt, int val) {
if(lf == rt) {
aint[node] = INF;
return ;
}
int mid = (lf + rt) >> 1;
if(aint[fs] == val)
rear(fs, lf, mid, val);
else rear(fd, mid + 1, rt, val);
aint[node] = min(aint[fs], aint[fd]);
}
int main() {
freopen("algsort.in", "r", stdin);
freopen("algsort.out", "w", stdout);
scanf("%d", &N);
build_tree(1, 1, N) ;
for(int i = 1; i <= N; ++i) {
int x;
scanf("%d", &x);
update(1, 1, N, i, x);
}
for(int i = 1; i <= N; ++i) {
printf("%d ", aint[1]);
rear(1, 1, N, aint[1]);
}
return 0;
}