Cod sursa(job #90206)
#include <cstdio>
#define maxN 60003
#define maxT 120006
int A[maxN], F[maxN], T1[maxT];
int N, x;
int max(int a, int b) { return a > b ? a : b; }
void build(int n, int st, int dr)
{
T1[n] = dr - st + 1;
if(st != dr)
{
int m = (st + dr) >> 1;
build(n<<1, st, m); build((n<<1)+1, m+1, dr);
}
}
void search(int n, int st, int dr, int p)
{
if(st == dr)
{
x = dr;
-- T1[n];
}
else
{
int m = (st + dr) >> 1;
if(T1[n<<1] >= p)
{
search(n<<1, st, m, p);
-- T1[n];
}
else
{
search((n<<1)+1, m+1, dr, p-T1[n<<1]);
-- T1[n];
}
}
}
int main()
{
freopen("schi.in", "rt", stdin);
freopen("schi.out", "wt", stdout);
int i;
for(scanf("%d", &N), i=1; i<=N; ++i)
scanf("%d", A+i);
build(1, 1, N);
for(i=N; i>=1; --i)
{
search(1, 1, N, A[i]);
F[x] = i;
}
for(i=1; i<=N; ++i) printf("%d\n", F[i]);
fclose(stdin);
fclose(stdout);
return 0;
}