func_code_string: #include <bits/stdc++.h>   const int N = 2e5 + 5;   using namespace std;   vector<int> G[N];   long long b[N];   int vis[N];   long long ans[N];   long long flag = 1;   void dfs(int x, int fa) {     long long minn = 0x3f3f3f3f;     if (b[x] == -1) {       for (int i = 0; i < G[x].size(); i++) {         int g = G[x][i];         if (!vis[g]) {           vis[g] = 1;           minn = min(minn, b[g]);           dfs(g, x);         }         if (minn != 0x3f3f3f3f)           b[x] = minn;         else           b[x] = b[fa];       }     } else {       for (int i = 0; i < G[x].size(); i++) {         int g = G[x][i];         if (!vis[g]) {           vis[g] = 1;           dfs(g, x);         }       }     }   }   void dfs2(int x, int fa) {     for (int i = 0; i < G[x].size(); i++) {       int g = G[x][i];       if (!vis[g]) {         vis[g] = 1;         ans[g] = b[g] - b[x];         if (ans[g] < 0) {           flag = 0;           return;         }         dfs2(g, x);       }     }   }   int main() {     int n;     cin >> n;     for (int i = 2; i <= n; i++) {       int u;       cin >> u;       G[i].push_back(u);       G[u].push_back(i);     }     for (int i = 1; i <= n; i++) cin >> b[i];     vis[1] = 1;     dfs(1, -1);     memset(vis, 0, sizeof vis);     vis[1] = 1;     ans[1] = b[1];     dfs2(1, -1);     if (flag) {       long long res = 0;       for (int i = 1; i <= n; i++)         if (ans[i] > 0) res += ans[i];       cout << res << endl;     } else       cout << -1 << endl;   }   