用c[i]来表示[i-lowbit(i)+1,i]区间内有多少个位置,接着二分查找num[i]+1的位置,接着在相关区间内减去一个位置(这步尤为重要,关乎前面能否查找到正确的位置)。
//
// main.cpp
// Richard
//
// Created by 邵金杰 on 16/8/20.
// Copyright © 2016年 邵金杰. All rights reserved.
//
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int maxn=50000;
int c[maxn],num[maxn],ans[maxn];
int n;
void add(int i,int x)
{
while(i<=n)
{
c[i]+=x;
i+=(i&(-i));
}
}
int sum(int p)
{
int s=0;
while(p)
{
s+=c[p];
p-=(p&(-p));
}
return s;
}
int binary_search(int x)
{
int l=0,r=n;
while(r-l>1)
{
int mid=(l+r)>>1;
int s=sum(mid);
if(s>=x)
r=mid;
else
l=mid;
}
return r;
}
int main()
{
while(scanf("%d",&n)!=EOF)
{
memset(c,0,sizeof(c));
for(int i=2;i<=n;i++)
scanf("%d",&num[i]);
for(int i=1;i<=n;i++)
add(i,1);
for(int i=n;i>=1;i--)
{
ans[i]=binary_search(num[i]+1);
add(ans[i],-1);
}
for(int i=1;i<=n;i++)
printf("%d\n",ans[i]);
}
return 0;
}