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 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95
| #include <bits/stdc++.h> using namespace std; typedef long long ll;
const ll N = 5010;
ll n, Q, a[N], tot, fa[N], sum[N], TOT, rt, kk, isf[N], pre, w[N]; vector<ll> g[N]; set<pair<ll, ll> > s;
void dfs(ll u) { sum[u] = a[u]; for (ll v : g[u]) { dfs(v); sum[u] += sum[v]; } }
void del(ll u, ll rt) { if (u == rt) return; s.erase(make_pair(w[u], u)); for (ll v : g[u]) del(v, rt); }
ll find() { ll wa, ua, wb, ub; auto res = s.lower_bound(make_pair(tot, 0)); wa = (*res).first; ua = (*res).second; res--; res = s.lower_bound(make_pair((*res).first, 0)); wb = (*res).first; ub = (*res).second; if (abs(tot - wa) < abs(tot - wb)) return ua; else if (abs(tot - wa) > abs(tot - wb)) return ub; else return min(ua, ub); }
int main() { scanf("%lld%lld", &n, &Q); for (int i = 1; i <= n; i++) { scanf("%lld", &a[i]); TOT += a[i]; } for (int i = 2; i <= n; i++) { scanf("%lld", &fa[i]); g[fa[i]].push_back(i); } dfs(1); for (int k = 1; k <= Q; k++) { rt = 1; tot = TOT; scanf("%lld", &kk); memset(isf, 0, sizeof(isf)); pre = kk; while (pre) { isf[pre] = 1; pre = fa[pre]; } s.clear(); for (int i = 1; i <= n; i++) { w[i] = sum[i] * 2; s.insert(make_pair(w[i], i)); } while (s.size() > 1) { ll u = find(); printf("%lld ", u); if (isf[u]) { tot = w[u] / 2; del(rt, u); rt = u; } else { tot -= w[u] / 2; del(u, 0); pre = fa[u]; while (pre) { if (s.erase(make_pair(w[pre], pre)) == 0) break; w[pre] -= w[u]; s.insert(make_pair(w[pre], pre)); pre = fa[pre]; } } } putchar('\n'); } return 0; }
|