//题目分析:并查集,节点祖先为连续的没有使用的节点,每次使用后的下一个点合并
//每个点的祖先是自己,如果自己被使用了,则祖先指向下一个点(即+1)(即合并)
#include<bits/stdc++.h>
using namespace std;
#define _for(n,m,i) for (register int i = (n); i < (m); ++i)
#define _rep(n,m,i) for (register int i = (n); i <= (m); ++i)
const int N = 2e6+5;
int a[N], f[N];
int Find(int x) {
return f[x] == x ? x : f[x] = Find(f[x]);
}
int main() {
int n; read(n);
_rep(1, 2*n, i) f[i] = i;
_rep(1, n, i) {
read(a[i]);

    int x = Find(a[i]);  //令x等于a[i]的祖先  //为什么不使用x=f[a[i]]呢?//因为当前a[i]的祖先不一定是f[x],所以要调用find(a[i]);
    a[i] = x;   
    f[x] = Find(x+1);   //用掉了x,所以令f[x]指向即等于(x+1)的祖先  //这条语句为合并两个集合

}
_rep(1, n, i) printf("%d%c", a[i], " \n"[n==i]);
return 0;
}