title:代码~~~ c ++#include <iostream>#include <cstring>#include <algorithm>using namespace std;const int N = 8e5 + 10, M = N << 2;int t[M];int a[N], ans[N];void build(int l, int r, int u = 1){ if (l == r) { t[u] = 1; return; } int mid = l + r >> 1; build(l, mid, u << 1), build(mid + 1, r, u << 1 | 1); t[u] = t[u << 1] + t[u << 1 | 1];}int query(int L, int R, int l, int r, int u = 1){ if (L <= l && R >= r) { return t[u]; } int mid = l + r >> 1; int res = 0; if (L <= mid) res += query(L, R, l, mid, u << 1); if (R > mid) res += query(L, R, mid + 1, r, u << 1 | 1); return res;}void modify(int idx, int l, int r, int u = 1){ if (l == r) { t[u] = 0; return; } int mid = l + r >> 1; if (mid >= idx) modify(idx, l, mid, u << 1); else modify(idx, mid + 1, r, u << 1 | 1); t[u] = t[u << 1] + t[u << 1 | 1];}int main(){ cin.tie(0)->sync_with_stdio(false); int n; cin >> n; for (int i = 2; i <= n; i++) cin >> a[i]; build(1, n); for (int i = n; i > 0; i--) { int l = 1, r = n; while (l < r) // 二分找所有前缀和位置中等于 a[i] + 1的位置 { int mid = (l + r) >> 1; if (query(1, mid, 1, n) >= a[i] + 1) r = mid; else l = mid + 1; } ans[i] = r; modify(r, 1, n); // 将该数标记为已确定 } for (int i = 1; i <= n; i++) cout << ans[i] << "\n"; return 0;}~~~