规律:
要确定某个数字p,那么我们就要知道p的前面有多少个数字比它小,记为m,p的后面有多少个数字比他小,记为n,那么p的位置就该在这个数列中的第m+n+1处,我们就二分这个p,拿每次得到的mid来和m+n+1来比较大小,如果m+n+1>mid就说明mid取小了,这个时候,我们就把left = mid+1;如果m+n+1<mid,那就说明mid取大了,这个时候我们就要把mid = right.
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int maxn=100010;
int a[maxn],c[maxn],ans[maxn];
int n;
void Update(int i,int k)
{
while(i<=n)
{
c[i]+=k;
i+=(-i&i);
}
}
int GetSum(int i)
{
int ans=0;
while(i>0)
{
ans+=c[i];
i-=(-i&i);
}
return ans;
}
int Search(int k)
{
int left=1,right=n;
while(left<right)
{
int mid=(left+right)>>1;
int num=GetSum(mid);
if(mid-1<num+k)
left=mid+1;
else
right=mid;
}
return left;
}
int main()
{
while(~scanf("%d",&n))
{
memset(c,0,sizeof(c));
memset(ans,0,sizeof(ans));
a[1]=0;
for(int i=2;i<=n;i++)
scanf("%d",&a[i]);
for(int i=n;i>0;i--)
{
int k=Search(a[i]);
Update(k,1);
ans[i]=k;
}
for(int i=1;i<=n;i++)
printf("%d\n",ans[i]);
}
}