1 #include<bits/stdc++.h> 2 //#pragma comment(linker, "/STACK:1024000000,1024000000") 3 #include<stdio.h> 4 #include<algorithm> 5 #include<queue> 6 #include<string.h> 7 #include<iostream> 8 #include<math.h> 9 #include<stack> 10 #include<set> 11 #include<map> 12 #include<vector> 13 #include<iomanip> 14 #include<bitset> 15 using namespace std; // 16 17 #define ll long long 18 #define ull unsigned long long 19 #define pb push_back 20 #define FOR(a) for(int i=1;i<=a;i++) 21 #define sqr(a) (a)*(a) 22 #define dis(a,b) sqrt(sqr(a.x-b.x)+sqr(a.y-b.y)) 23 ll qp(ll a,ll b,ll mod){ 24 ll t=1;while(b){if(b&1)t=t*a%mod;b>>=1;a=a*a%mod;}return t; 25 } 26 struct DOT{ll x;ll y;}; 27 inline void read(int &x){int k=0;char f=1;char c=getchar();for(;!isdigit(c);c=getchar())if(c=='-')f=-1;for(;isdigit(c);c=getchar())k=k*10+c-'0';x=k*f;} 28 const int dx[4]={0,0,-1,1}; 29 const int dy[4]={1,-1,0,0}; 30 const int inf=0x3f3f3f3f; 31 const ll Linf=0x3f3f3f3f3f3f3f3f; 32 const ll mod=1e9+7;; 33 34 const int maxn=2e5+9; 35 36 int n; 37 38 struct EDGE{ 39 int v;int w;int next; 40 }G[maxn<<2]; 41 int head[maxn],tot; 42 43 inline void addedge(int u,int v,int w){ 44 ++tot;G[tot].v=v;G[tot].next=head[u];G[tot].w=w;head[u]=tot; 45 } 46 47 /* 48 int top[maxn]; 49 int pre[maxn]; 50 int dep[maxn]; 51 int num[maxn]; //子树尺寸 52 int p[maxn]; //v的对应位置 53 int out[maxn]; //退出时间戳 54 int fp[maxn]; //访问序列 55 int son[maxn]; //重儿子 56 int pos; //计时器 57 */ 58 inline void init(){ 59 memset(head,-1,sizeof head);tot=0; 60 //memset(son,-1,sizeof son); 61 } 62 /* 63 inline void dfs1(int u,int fa,int d){ 64 dep[u]=d; 65 pre[u]=fa; 66 num[u]=1; 67 for(int i=head[u];~i;i=G[i].next){ 68 int v=G[i].v; 69 if(v==fa)continue; 70 dfs1(v,u,d+G[i].w); 71 num[u]+=num[v]; 72 if(son[u]==-1||num[v]>num[son[u]])son[u]=v; 73 } 74 } 75 inline void getpos(int u,int sp){ 76 top[u]=sp; 77 p[u]=out[u]=++pos; 78 79 fp[p[u]]=u; 80 if(son[u]==-1)return; 81 getpos(son[u],sp); 82 for(int i=head[u];~i;i=G[i].next){ 83 int v=G[i].v; 84 if(v!=son[u]&&v!=pre[u])getpos(v,v); 85 } 86 out[u]=pos; 87 } 88 */ 89 ll add[maxn]; 90 int a[maxn]; 91 92 /* 93 struct NODE{ 94 int l,r; 95 ll sum; 96 ll add; 97 }ST[maxn<<2]; 98 inline void pushup(int rt){ 99 ST[rt].sum=ST[rt<<1].sum+ST[rt<<1|1].sum; 100 } 101 inline void pushdown(int rt){ 102 if(ST[rt].add){ 103 ST[rt<<1].sum+=ST[rt].add*(ST[rt<<1].r-ST[rt<<1].l+1); 104 ST[rt<<1|1].sum+=ST[rt].add*(ST[rt<<1|1].r-ST[rt<<1|1].l+1); 105 ST[rt<<1].add+=ST[rt].add; 106 ST[rt<<1|1].add+=ST[rt].add; 107 ST[rt].add=0; 108 } 109 } 110 inline void build(int l,int r,int rt){ 111 if(l==r){ST[rt].l=ST[rt].r=l;ST[rt].sum=0;return;} 112 ST[rt].l=l;ST[rt].r=r; 113 int m=l+r>>1; 114 build(l,m,rt<<1);build(m+1,r,rt<<1|1);pushup(rt); 115 } 116 inline void update(int a,int b,int c,int l,int r,int rt){ 117 if(a<=l&&b>=r){ 118 ST[rt].sum+=(r-l+1)*c; 119 ST[rt].add+=c; 120 return; 121 } 122 int m=l+r>>1; 123 pushdown(rt); 124 if(a<=m)update(a,b,c,l,m,rt<<1); 125 if(b> m)update(a,b,c,m+1,r,rt<<1|1); 126 pushup(rt); 127 } 128 inline ll query(int x,int l,int r,int rt){ 129 if(l==r){return ST[rt].sum;} 130 int m=l+r>>1; 131 pushdown(rt); 132 if(x<=m)return query(x,l,m,rt<<1); 133 else return query(x,m+1,r,rt<<1|1); 134 } 135 136 inline void solve(int u,int v){ 137 138 while(top[u]!=top[v]){ 139 140 if(dep[top[u]]<dep[top[v]])swap(u,v); 141 update(p[top[u]],p[u],1,1,n,1); 142 u=pre[top[u]]; 143 } 144 145 if(dep[u]<dep[v])swap(u,v); 146 147 //cout<<p[u]<<"ww"<<p[v]<<endl; 148 update(p[v],p[u],1,1,n,1); 149 } 150 */ 151 152 int fa[maxn][50]; 153 ll falen[maxn][50]; 154 155 void dfs(int u){ 156 157 for(int i=head[u];~i;i=G[i].next){ 158 dfs(G[i].v); 159 add[u]+=add[G[i].v]; 160 } 161 } 162 163 int main(){ 164 read(n); 165 init(); 166 for(int i=1;i<=n;i++){ 167 read(a[i]); 168 } 169 for(int i=2,x,y;i<=n;i++){ 170 read(x);read(y); 171 addedge(x,i,y); 172 fa[i][0]=x; 173 falen[i][0]=y; 174 } 175 176 for(int i=0;i<=32;i++){ 177 fa[1][i]=0; 178 falen[0][i]=Linf; 179 falen[1][i]=Linf; 180 } 181 for(int i=1;i<=32;i++){ 182 for(int j=1;j<=n;j++){ 183 fa[j][i]=fa[fa[j][i-1]][i-1]; 184 if(falen[fa[j][i-1]][i-1]==Linf){ 185 falen[j][i]=Linf;continue; 186 } 187 falen[j][i]=falen[fa[j][i-1]][i-1]+falen[j][i-1]; 188 } 189 } 190 191 for(int i=2;i<=n;i++){ 192 int now=i; 193 for(int j=32;j>=0;j--){ 194 if(falen[now][j] <= a[i]){ 195 a[i]-=falen[now][j]; 196 now=fa[now][j]; 197 } 198 } 199 200 if(i==now)continue; 201 add[fa[i][0]]++;add[fa[now][0]]--; 202 } 203 dfs(1); 204 for(int i=1;i<=n;i++)printf("%lld ",add[i]); 205 //for(int i=1;i<=n;i++)printf("%lld ",query(p[i],1,n,1)); 206 207 }