func_code_string: #include <bits/stdc++.h>   using namespace std;   long long const N = 2e5 + 20, MOD = 1e9 + 7;   long long n, x, dp[N][2];   bool vis[N], col[N];   vector<long long> child[N];   void dfs(int v = 0) {     for (auto u : child[v]) dfs(u);     vector<long long> preChild, sufChild;     preChild.push_back(1), sufChild.push_back(1);     for (auto u : child[v]) {       preChild.push_back((preChild.back() * ((dp[u][0] + dp[u][1]) % MOD)) % MOD);     }     for (int i = child[v].size() - 1; i >= 0; i--) {       int u = child[v][i];       sufChild.push_back((sufChild.back() * ((dp[u][0] + dp[u][1]) % MOD)) % MOD);     }     if (col[v]) {       dp[v][0] = 0;       dp[v][1] = preChild.back();       return;     }     dp[v][0] = preChild.back();     dp[v][1] = 0;     preChild.push_back(1), sufChild.push_back(1);     for (int i = 0; i < child[v].size(); i++) {       int u = child[v][i];       dp[v][1] = (dp[v][1] + ((dp[u][1] * preChild[i] % MOD) *                               (sufChild[sufChild.size() - 3 - i] % MOD) % MOD)) %                  MOD;     }     return;   }   int main() {     ios::sync_with_stdio(false);     cin.tie(0);     cin >> n;     for (int i = 0; i < n - 1; i++) {       cin >> x;       child[x].push_back(i + 1);     }     for (int i = 0; i < n; i++) cin >> col[i];     dfs();     return cout << dp[0][1], 0;   }   