Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- #define ll long long
- #define pb push_back
- #define mp make_pair
- #define s second
- #define f first
- #define _ ios_base::sync_with_stdio(false);cin.tie(0);
- using namespace std;
- const int maxn = (int)(5e5)+2;
- const int mod = (int)(1e9)+7;
- int a[maxn];
- ll w[maxn][20];
- int n, p[maxn], cost[maxn], up[maxn][20], d[maxn], arr[maxn];
- vector <int> g[maxn];
- void dfs(int v) {
- up[v][0] = p[v];
- w[v][0] = cost[v];
- for (int i = 1; i <= 18; i++) {
- up[v][i] = up[up[v][i-1]][i-1];
- w[v][i] = w[v][i-1] + w[up[v][i-1]][i-1];
- }
- for (int i = 0; i < g[v].size(); i++) {
- int to = g[v][i];
- dfs(to);
- d[v] += d[to];
- d[v] -= arr[v];
- arr[v] = 0;
- }
- int go = v;
- ll sum = 0;
- for (int l = 18; l >= 0; l--) {
- if (up[go][l] > 0 && sum + w[go][l] <= a[v]) {
- sum += w[go][l];
- go = up[go][l];
- }
- }
- arr[up[go][0]]++;
- d[v]++;
- }
- int main() {
- _
- #ifndef ONLINE_JUDGE
- freopen("in","r", stdin);
- freopen("out","w",stdout);
- #endif
- cin >> n;
- for (int i = 1; i <= n; i++) cin >> a[i];
- for (int i = 2; i <= n; i++) {
- cin >> p[i] >> cost[i];
- g[p[i]].pb(i);
- }
- dfs(1);
- for (int i = 1; i <= n; i++)
- cout << d[i] - 1 << ' ' ;
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement