func_code_string: #include <bits/stdc++.h>   using namespace std;   int dp[5002][5002][2];   vector<vector<int> > adj(12345);   int subtree[5004], c[5003], d[5003], dp1[5003], dp2[5003];   int dfs(int u) {     int i, j, k, sumi = 1;     subtree[u] = 1;     for (i = 0; i < adj[u].size(); i++) {       dfs(adj[u][i]);       subtree[u] += subtree[adj[u][i]];     }     if (subtree[u] == 1) {       dp[u][1][0] = c[u];       dp[u][1][1] = c[u] - d[u];       dp[u][0][1] = 0;       dp[u][0][0] = 0;       return 0;     }     for (i = 0; i < subtree[u] + 2; i++) {       dp1[i] = (1000 * 1000 * 1000 + 5);       dp2[i] = (1000 * 1000 * 1000 + 5);       dp[u][i][0] = (1000 * 1000 * 1000 + 5);       dp[u][i][1] = (1000 * 1000 * 1000 + 5);     }     dp[u][1][1] = c[u] - d[u];     sumi = 1;     for (i = 0; i < adj[u].size(); i++) {       for (j = 0; j < sumi + 1; j++) {         for (k = 0; k < subtree[adj[u][i]] + 1; k++) {           dp1[j + k] = min(dp1[j + k], dp[u][j][1] + dp[adj[u][i]][k][1]);           dp1[j + k] = min(dp1[j + k], (1000 * 1000 * 1000 + 5));         }       }       sumi += subtree[adj[u][i]];       for (j = 0; j < sumi + 1; j++) {         dp[u][j][1] = min(dp[u][j][1], dp1[j]);         dp1[j] = (1000 * 1000 * 1000 + 5);       }     }     sumi = 1;     dp1[0] = 0;     for (i = 0; i < adj[u].size(); i++) {       for (j = 0; j < sumi + 1; j++) {         for (k = 0; k < subtree[adj[u][i]] + 1; k++) {           dp2[j + k] = min(dp2[j + k], dp1[j] + dp[adj[u][i]][k][0]);           dp2[j + k] = min(dp2[j + k], (1000 * 1000 * 1000 + 5));         }       }       sumi += subtree[adj[u][i]];       for (j = 0; j < sumi + 1; j++) {         dp1[j] = min(dp1[j], dp2[j]);         dp2[j] = (1000 * 1000 * 1000 + 5);       }     }     for (i = 0; i < subtree[u] + 1; i++) {       dp[u][i][1] = min(dp[u][i][1], dp1[i]);       dp1[i] = (1000 * 1000 * 1000 + 5);     }     dp[u][1][0] = c[u];     dp[u][0][0] = 0;     sumi = 1;     for (i = 0; i < adj[u].size(); i++) {       for (j = 0; j < sumi + 1; j++) {         for (k = 0; k < subtree[adj[u][i]] + 1; k++) {           dp1[j + k] = min(dp1[j + k], dp[u][j][0] + dp[adj[u][i]][k][0]);           dp1[j + k] = min(dp1[j + k], (1000 * 1000 * 1000 + 5));         }       }       sumi += subtree[adj[u][i]];       for (j = 0; j < sumi + 1; j++) {         dp[u][j][0] = min(dp[u][j][0], dp1[j]);         dp1[j] = (1000 * 1000 * 1000 + 5);       }     }     return 0;   }   int main() {     std::ios::sync_with_stdio(false);     int n, val;     int i, u;     cin >> n >> val;     cin >> c[0] >> d[0];     for (i = 1; i < n; i++) {       cin >> c[i] >> d[i];       cin >> u;       u--;       adj[u].push_back(i);     }     dfs(0);     for (i = n; i >= 0; i--) {       if (dp[0][i][1] <= val) {         cout << i << endl;         return 0;       }     }   }   