Problem:
Score : 300 points

Problem Statement

Takahashi is a teacher responsible for a class of N students.

The students are given distinct student numbers from 1 to N.

Today, all the students entered the classroom at different times.

According to Takahashi's record, there were A_i students in the classroom when student number i entered the classroom (including student number i).

From these records, reconstruct the order in which the students entered the classroom.

Constraints

1 \le N \le 10^5

1 \le A_i \le N

A_i \neq A_j (i \neq j)

All values in input are integers.

Input

Input is given from Standard Input in the following format:

N
A_1 A_2 \ldots A_N

Output

Print the student numbers of the students in the order the students entered the classroom.

Sample Input 1

3
2 3 1

Sample Output 1

3 1 2

First, student number 3 entered the classroom.

Then, student number 1 entered the classroom.

Finally, student number 2 entered the classroom.

Sample Input 2

5
1 2 3 4 5

Sample Output 2

1 2 3 4 5

Sample Input 3

8
8 2 7 3 4 5 6 1

Sample Output 3

8 2 4 5 6 7 3 1

Solution in C (GCC 5.4.1) (judge verdict: Accepted)

#define NDEBUG

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>

#include <assert.h>
// for DEBUG {{{
#ifdef NDEBUG
#define DEBUG_PRINT(fmt, ...) ((void)0)
#else
#define DEBUG_PRINT(fmt, ...) fprintf(stderr, fmt, ##__VA_ARGS__)
#endif
#define ASSERT_RANGE(min,x,max) assert(((x)>=(min)) && ((x)<=(max)))
// }}}

typedef long long ll;

#define GET_D(x) fscanf(stdin,"%d",&(x)) > 0
#define GET_LLD(x) fscanf(stdin,"%lld",&(x)) > 0
#define GET_S(x) fscanf(stdin,"%s",(x)) > 0

#define PUT_D(x) fprintf(stdout,"%d\n",(x))
#define PUT_Ds(x) fprintf(stdout,"%d ",(x))
#define PUT_LLD(x) fprintf(stdout,"%lld\n",(x))
#define PUT_LLDs(x) fprintf(stdout,"%lld ",(x))
#define PUT_LN fprintf(stdout,"\n")

#define FOR(i,min,max) for ((i) = (min); (i) < (max); (i)++)

void merge_int(int *val, int lower, int sep, int upper, int *tmp_val) {// {{{
	int i_lower = lower;
	int i_upper = sep;
	int i_b = 0;
	while ((i_lower < sep) && (i_upper < upper)) {
		if (val[i_lower] < val[i_upper]) {
			tmp_val[i_b++] = val[i_lower++];
		} else {
			tmp_val[i_b++] = val[i_upper++];
		}
	}
	if (i_lower >= sep) {
		while (i_upper < upper) {
			tmp_val[i_b++] = val[i_upper++];
		}
	} else {
		while (i_lower < sep) {
			tmp_val[i_b++] = val[i_lower++];
		}
	}
	for (i_lower = 0; i_lower < i_b; i_lower++) {
		val[i_lower+lower] = tmp_val[i_lower];
	}
}// }}}
void merge_sort_int(int *val, int lower, int upper, int *tmp_val) {// {{{
	int sep;
	if ((lower == upper) || (lower + 1 == upper)) {
		return;
	}
	sep = (lower + upper) / 2;
	merge_sort_int(val,lower,sep,tmp_val);
	merge_sort_int(val,sep,upper,tmp_val);
	merge_int(val,lower,sep,upper,tmp_val);
	return;
}// }}}

void merge_int_int(int *val, int *index, int lower, int sep, int upper, int *tmp_val, int *tmp_index) {// {{{
	int i_lower = lower;
	int i_upper = sep;
	int i_b = 0;
	while ((i_lower < sep) && (i_upper < upper)) {
		if (val[i_lower] < val[i_upper]) {
			tmp_val[i_b] = val[i_lower];
			tmp_index[i_b] = index[i_lower];
			i_b++;
			i_lower++;
		} else {
			tmp_val[i_b] = val[i_upper];
			tmp_index[i_b] = index[i_upper];
			i_b++;
			i_upper++;
		}
	}
	if (i_lower >= sep) {
		while (i_upper < upper) {
			tmp_val[i_b] = val[i_upper];
			tmp_index[i_b] = index[i_upper];
			i_b++;
			i_upper++;
		}
	} else {
		while (i_lower < sep) {
			tmp_val[i_b] = val[i_lower];
			tmp_index[i_b] = index[i_lower];
			i_b++;
			i_lower++;
		}
	}
	for (i_lower = 0; i_lower < i_b; i_lower++) {
		val[i_lower+lower] = tmp_val[i_lower];
		index[i_lower+lower] = tmp_index[i_lower];
	}
}// }}}
void merge_sort_int_int(int *val, int *index, int lower, int upper, int *tmp_val, int *tmp_index) {// {{{
	int sep;
	if ((lower == upper) || (lower + 1 == upper)) {
		return;
	}
	sep = (lower + upper) / 2;
	merge_sort_int_int(val,index,lower,sep,tmp_val,tmp_index);
	merge_sort_int_int(val,index,sep,upper,tmp_val,tmp_index);
	merge_int_int(val,index,lower,sep,upper,tmp_val,tmp_index);
	return;
}// }}}

void merge_ll(ll *val, ll lower, ll sep, ll upper, ll *tmp_val) {// {{{
	ll i_lower = lower;
	ll i_upper = sep;
	ll i_b = 0;
	while ((i_lower < sep) && (i_upper < upper)) {
		if (val[i_lower] < val[i_upper]) {
			tmp_val[i_b++] = val[i_lower++];
		} else {
			tmp_val[i_b++] = val[i_upper++];
		}
	}
	if (i_lower >= sep) {
		while (i_upper < upper) {
			tmp_val[i_b++] = val[i_upper++];
		}
	} else {
		while (i_lower < sep) {
			tmp_val[i_b++] = val[i_lower++];
		}
	}
	for (i_lower = 0; i_lower < i_b; i_lower++) {
		val[i_lower+lower] = tmp_val[i_lower];
	}
}// }}}
void merge_sort_ll(ll *val, ll lower, ll upper, ll *tmp_val) {// {{{
	ll sep;
	if ((lower == upper) || (lower + 1 == upper)) {
		return;
	}
	sep = (lower + upper) / 2;
	merge_sort_ll(val,lower,sep,tmp_val);
	merge_sort_ll(val,sep,upper,tmp_val);
	merge_ll(val,lower,sep,upper,tmp_val);
	return;
}// }}}

void merge_ll_ll(ll *val, ll *index, ll lower, ll sep, ll upper, ll *tmp_val, ll *tmp_index) {// {{{
	ll i_lower = lower;
	ll i_upper = sep;
	ll i_b = 0;
	while ((i_lower < sep) && (i_upper < upper)) {
		if (val[i_lower] < val[i_upper]) {
			tmp_val[i_b] = val[i_lower];
			tmp_index[i_b] = index[i_lower];
			i_b++;
			i_lower++;
		} else {
			tmp_val[i_b] = val[i_upper];
			tmp_index[i_b] = index[i_upper];
			i_b++;
			i_upper++;
		}
	}
	if (i_lower >= sep) {
		while (i_upper < upper) {
			tmp_val[i_b] = val[i_upper];
			tmp_index[i_b] = index[i_upper];
			i_b++;
			i_upper++;
		}
	} else {
		while (i_lower < sep) {
			tmp_val[i_b] = val[i_lower];
			tmp_index[i_b] = index[i_lower];
			i_b++;
			i_lower++;
		}
	}
	for (i_lower = 0; i_lower < i_b; i_lower++) {
		val[i_lower+lower] = tmp_val[i_lower];
		index[i_lower+lower] = tmp_index[i_lower];
	}
}// }}}
void merge_sort_ll_ll(ll *val, ll *index, ll lower, ll upper, ll *tmp_val, ll *tmp_index) {// {{{
	ll sep;
	if ((lower == upper) || (lower + 1 == upper)) {
		return;
	}
	sep = (lower + upper) / 2;
	merge_sort_ll_ll(val,index,lower,sep,tmp_val,tmp_index);
	merge_sort_ll_ll(val,index,sep,upper,tmp_val,tmp_index);
	merge_ll_ll(val,index,lower,sep,upper,tmp_val,tmp_index);
	return;
}// }}}


#define N_MIN 1
#define N_MAX 100000

int main(int argc, char **argv) {
	ll n;
	ll val[N_MAX];
	ll index[N_MAX];
	GET_LLD(n);
	{
		ll i;
		FOR(i,0,n) {
			GET_LLD(val[i]);
			index[i] = i+1;
		}
	}
	{
		ll tmp_val[N_MAX];
		ll tmp_index[N_MAX];
		merge_sort_ll_ll(val,index,0,n,tmp_val,tmp_index);
	}
	{
		ll i;
		FOR(i,0,n) {
			PUT_LLDs(index[i]);
		}
		PUT_LN;
	}
	return 0;
}