func_code_string: #include <bits/stdc++.h>   using namespace std;   const int N = 100005;   int head[N], Next[N], ver[N], tot;   inline void add(int u, int v) {     ver[++tot] = v, Next[tot] = head[u], head[u] = tot;   }   int pa[N][25], top[N], son[N], dep[N], ans, n, L;   long long sum[N], w[N], S;   inline void init(int u) {     for (int i = 1; i <= 20; ++i) pa[u][i] = pa[pa[u][i - 1]][i - 1];     int dis = L, tmp = u;     for (int i = 20; i >= 0; --i) {       int fa = pa[tmp][i];       if (!fa || (1 << i) >= dis) continue;       if (sum[u] - sum[fa] + w[fa] > S) continue;       dis -= (1 << i), top[u] = fa, tmp = fa;     }   }   void dfs1(int u, int fa) {     sum[u] = sum[fa] + w[u], top[u] = u, dep[u] = dep[fa] + 1, init(u);     for (int i = head[u]; i; i = Next[i]) dfs1(ver[i], u);   }   void dfs2(int u) {     int mx = -1;     for (int i = head[u]; i; i = Next[i]) {       int v = ver[i];       dfs2(v);       if (son[v] == v) continue;       if (mx == -1 || dep[mx] > dep[son[v]]) mx = son[v];     }     if (mx == -1) ++ans, mx = top[u];     son[u] = mx;   }   int main() {     scanf( %d%d%lld , &n, &L, &S);     for (int i = 1; i <= n; ++i) {       scanf( %lld , &w[i]);       if (w[i] > S) return puts( -1 ), 0;     }     for (int i = 2, f; i <= n; ++i) scanf( %d , &f), add(f, i), pa[i][0] = f;     dfs1(1, 0), dfs2(1);     printf( %d n , ans);     return 0;   }   