Problem:
Problem G: Chairs

Problem

1からNの番号が割り当てられたN脚の椅子に、1からNのIDが割り当てられたN人の人が座ろうとしている。IDがiの人は椅子piに座りたいと思っている。

N人の人はIDが小さい順に1列に並び、列の先頭の人が以下の行動をとる。

椅子piに誰も座っていなければ、その椅子に座る。

そうでなければ、piに1を加算し、列の最後尾に並び直す。ただし、piがNを超えた場合はpiを1にする。

全ての人が椅子に座るまでこの行動が繰り返されたとき、最終的に各椅子に座っている人のIDを出力せよ。

Input

入力は以下の形式で与えられる。

N
p1 p2 ... pN

1行目に整数Nが与えられる。

2行目にN個の整数p1, p2, ..., pNが空白区切りで与えられる。

Constraints

入力は以下の条件を満たす。

1 ≤ N ≤ 105

1 ≤ pi ≤ N

Output

N行に最終的な状態を出力する。

i行目に椅子iに座っている人のIDを出力する。

Sample Input 1

5
1 2 3 4 5

Sample Output 1

1
2
3
4
5

Sample Input 2

5
3 3 4 4 5

Sample Output 2

4
2
1
3
5

Solution in C++14 (judge verdict: Accepted)

#include <bits/stdc++.h>
#define rep(i,n) for(int i=0;i<(int)(n);i++)
#define rep1(i,n) for(int i=1;i<=(int)(n);i++)
#define all(c) c.begin(),c.end()
#define pb push_back
#define fs first
#define sc second
#define show(x) cout << #x << " = " << x << endl
#define chmin(x,y) x=min(x,y)
#define chmax(x,y) x=max(x,y)
using namespace std;
template<class S,class T> ostream& operator<<(ostream& o,const pair<S,T> &p){return o<<"("<<p.fs<<","<<p.sc<<")";}
template<class T> ostream& operator<<(ostream& o,const vector<T> &vc){o<<"sz = "<<vc.size()<<endl<<"[";for(const T& v:vc) o<<v<<",";o<<"]";return o;}
int N;
const int MN=100000;
vector<int> a[MN];
int ans[MN];
stack<int> st;
int main(){
	cin>>N;
	rep(i,N) ans[i]=-1;
	rep(i,N){
		int x;
		cin>>x;
		x--;
		a[x].pb(i);
	}
	rep(i,N) reverse(all(a[i]));
	rep(i,2*N){
		if(i<N) for(int x:a[i]) st.push(x);
		if(!st.empty() && ans[i%N]==-1){
			ans[i%N]=st.top();
			st.pop();
		}
	}
	rep(i,N) cout<<ans[i]+1<<endl;
}