题目地址
配套地址

#include<bits/stdc++.h>
using namespace std;
const int N = 1e5 + 10;
int c[N],n,a[N],ans[N];
bool vis[N];
#define lowbit(x) (x & -x)
void change(int x,int v){
for(int i=x;i<=n;i+=lowbit(i)) c[i] += v;
}
int ask(int x){
int res = 0;
for(int i=x;i;i-=lowbit(i)) res += c[i];
return res;
}
int main(){
cin>>n;
for(int i=2;i<=n;i++) cin>>a[i];
for(int i=n;i>=2;i--){
int l = 1,r = n,k = a[i] + 1;
while(l < r){
int mid = (l + r) >> 1;
if((mid - ask(mid)) >= k) r = mid;
else l = mid + 1;
}
change(r,1);
ans[i] = r;
vis[r] = true;
}
ans[1] = 1;
while(vis[ans[1]]) ans[1] ++;
for(int i=1;i<=n;i++) cout<<ans[i]<<endl;
return 0;
}