Advertisement
Guest User

Untitled

a guest
Mar 29th, 2017
62
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.25 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. #define ll long long
  3. #define pb push_back
  4. #define mp make_pair
  5. #define s second
  6. #define f first
  7. #define _ ios_base::sync_with_stdio(false);cin.tie(0);
  8.  
  9. using namespace std;
  10.  
  11. const int maxn = (int)(5e5)+2;
  12. const int mod = (int)(1e9)+7;
  13.  
  14.  
  15. int a[maxn];
  16. ll w[maxn][20];
  17. int n, p[maxn], cost[maxn], up[maxn][20], d[maxn], arr[maxn];
  18. vector <int> g[maxn];
  19.  
  20. void dfs(int v) {
  21. up[v][0] = p[v];
  22. w[v][0] = cost[v];
  23. for (int i = 1; i <= 18; i++) {
  24. up[v][i] = up[up[v][i-1]][i-1];
  25. w[v][i] = w[v][i-1] + w[up[v][i-1]][i-1];
  26. }
  27. for (int i = 0; i < g[v].size(); i++) {
  28. int to = g[v][i];
  29. dfs(to);
  30. d[v] += d[to];
  31. d[v] -= arr[v];
  32. arr[v] = 0;
  33. }
  34. int go = v;
  35. ll sum = 0;
  36. for (int l = 18; l >= 0; l--) {
  37. if (up[go][l] > 0 && sum + w[go][l] <= a[v]) {
  38. sum += w[go][l];
  39. go = up[go][l];
  40. }
  41. }
  42. arr[up[go][0]]++;
  43. d[v]++;
  44. }
  45.  
  46.  
  47. int main() {
  48. _
  49.  
  50. #ifndef ONLINE_JUDGE
  51. freopen("in","r", stdin);
  52. freopen("out","w",stdout);
  53. #endif
  54. cin >> n;
  55. for (int i = 1; i <= n; i++) cin >> a[i];
  56. for (int i = 2; i <= n; i++) {
  57. cin >> p[i] >> cost[i];
  58. g[p[i]].pb(i);
  59. }
  60. dfs(1);
  61. for (int i = 1; i <= n; i++)
  62. cout << d[i] - 1 << ' ' ;
  63. return 0;
  64. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement