链接:http://codeforces.com/problemset/problem/682/C
dp[v]表示以v为终点所需消耗的最大值 当d[v]大于a[v]时就删除以v为根节点的子树
#include <bits/stdc++.h>
using namespace std;
#define ll long long
const int N=1e5+5;
vector<pair<int,int> >G[N];
ll n,a[N],dp[N],flag[N];
void dfs(int u)
{
flag[u]=1;
for(int i=0;i<G[u].size();i++)
{
ll v=G[u][i].first;
ll len=G[u][i].second;
dp[v]=dp[u]+len;
if(dp[v]<0)dp[v]=0;
if(dp[v]<=a[v])
dfs(v);
}
}
int main()
{
scanf("%I64d",&n);
for(int i=1;i<=n;i++)
scanf("%I64d",a+i);
for(int i=2;i<=n;i++)
{
int u,len;
scanf("%d%d",&u,&len);
G[u].push_back({i,len});
}
dfs(1);
int cnt=0;
for(int i=1;i<=n;i++)
if(flag[i]) cnt++;
printf("%d\n",n-cnt);
return 0;
}