1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75
| #include <bits/stdc++.h> using namespace std; const int maxn = 1e5 + 50;
int n, num, rt[maxn], dis[maxn], a[maxn], ans[maxn]; int tot, head[maxn], ver[maxn << 1], nxt[maxn << 1];
int cnt, lc[maxn * 18], rc[maxn * 18], s[maxn * 18];
void add(int x, int y) { ver[++tot] = y, nxt[tot] = head[x], head[x] = tot; }
void update(int &p, int l, int r, int x) { if (!p) p = ++cnt; if (l == r) { s[p] += 1; return; } int mid = (l + r) >> 1; if (x <= mid) update(lc[p], l, mid, x); if (x > mid) update(rc[p], mid + 1, r, x); s[p] = s[lc[p]] + s[rc[p]]; }
int ask(int p, int l, int r, int L, int R) { if (l >= L && r <= R) return s[p]; int mid = (l + r) >> 1, ans = 0; if (L <= mid && lc[p]) ans += ask(lc[p], l, mid, L, R); if (R > mid && rc[p]) ans += ask(rc[p], mid + 1, r, L, R); return ans; }
int merge(int p, int q, int l, int r) { if (!p || !q) return p + q; if (l == r) { s[p] += s[q]; return p; } int mid = (l + r) >> 1; lc[p] = merge(lc[p], lc[q], l, mid); rc[p] = merge(rc[p], rc[q], mid + 1, r); s[p] = s[lc[p]] + s[rc[p]]; return p; }
void dfs(int x, int f) { for (int i = head[x]; i; i = nxt[i]) { int y = ver[i]; if (y == f) continue; dfs(y, x); rt[x] = merge(rt[x], rt[y], 1, num); } if (a[x] < num) ans[x] = ask(rt[x], 1, num, a[x] + 1, num); }
int main() { scanf("%d", &n); for (int i = 1; i <= n; ++i) { scanf("%d", &a[i]); dis[i] = a[i]; } sort(dis + 1, dis + 1 + n); num = unique(dis + 1, dis + 1 + n) - 1 - dis; for (int i = 1; i <= n; ++i) { a[i] = lower_bound(dis + 1, dis + 1 + num, a[i]) - dis; } update(rt[1], 1, num, a[1]); for (int x, i = 2; i <= n; ++i) { scanf("%d", &x); add(x, i), add(i, x); update(rt[i], 1, num, a[i]); } dfs(1, 0); for (int i = 1; i <= n; ++i) printf("%d\n", ans[i]); return 0; }
|