include [HTML_REMOVED]
include [HTML_REMOVED]
include [HTML_REMOVED]
include [HTML_REMOVED]
using namespace std;
const int N = 100010;
int n;
int h[N];
int ans[N];
int tr[N];
// 树状数组的三个基本函数,使用二进制维护
int lowbit(int x)
{
return x & -x;
}
void add(int x, int c)
{
for(int i = x; i <= n; i += lowbit(i)) tr[i] += c;
}
int sum(int x)
{
int res = 0;
for(int i = x; i; i -= lowbit(i)) res += tr[i];
return res;
}
int main()
{
scanf(“%d”, &n);
for(int i = 2; i <= n; i++) scanf(“%d”, &h[i]);
// 因为每一个数都是1,所以其总和就是区间长度
for(int i = 1; i <= n; i++) tr[i] = lowbit(i);
for(int i = n; i; i--)
{
// 计算当前牛在剩余身高中的位置
int k = h[i] + 1;
// 使用二分,多次计算前缀和,完成判断
int l = 1, r = n;
while(l < r)
{
int mid = (l + r) / 2;
if(sum(mid) >= k) r = mid;
else l = mid + 1;
}
// 标记,更新数组
ans[i] = l;
add(l, -1);
}
for(int i = 1; i <= n; i++) printf("%d\n", ans[i]);
return 0;
}