http://poj.org/problem?id=2182
线段树,单点更新,单点查询
#include <stdio.h> #define lson l, m, root<<1 #define rson m+1, r, root<<1|1 #define N 80008 int sum[N<<2]; void push_up(int root) { sum[root] = sum[root<<1] + sum[root<<1|1]; } void build(int l, int r, int root) { int m; if(l == r) { sum[root] = 1; return; } m = (l + r) >> 1; build(lson); build(rson); push_up(root); } void update(int x, int l, int r, int root) { int m; if(l == r) { sum[root] = 0; return; } m = (l + r) >> 1; if(x <= m) { update(x, lson); } if(m+1 <= x) { update(x, rson); } push_up(root); } int query(int x, int l, int r, int root) { int m; if(l == r) { return l; } m = (l + r) >> 1; if(sum[root<<1] >= x) { return query(x, lson); } return query(x-sum[root<<1], rson); } int main() { int n, i, a[N], b[N]; scanf("%d", &n); build(1, n, 1); for(i=2; i<=n; i++) { scanf("%d", a+i); } for(i=n; i>=2; i--) { b[i] = query(a[i]+1, 1, n, 1); update(b[i], 1, n, 1); } b[1] = query(1, 1, n, 1); for(i=1; i<=n; i++) { printf("%d\n", b[i]); } return 0; }