int n, x; int p[kMaxN], b[kMaxN], w[kMaxN], c[kMaxN], res[kMaxN]; int sz[kMaxN], wson[kMaxN]; std::vector<int> G[kMaxN];
inlinevoidchkmax(int &x, int y){ x = (x > y ? x : y); } inlinevoidchkmin(int &x, int y){ x = (x < y ? x : y); }
voiddfs1(int u){ sz[u] = 1; for (auto v : G[u]) { dfs1(v); sz[u] += sz[v]; if (sz[v] > sz[wson[u]]) wson[u] = v; } }
std::array<std::vector<int>, 2> dfs2(int u, std::vector<int> now, bool op) { if (op) { for (auto v : G[u]) { if (v != wson[u]) dfs2(v, now, op); } } std::array<std::vector<int>, 2> f = {now, now}; if (wson[u]) f = dfs2(wson[u], now, op); for (auto v : G[u]) { if (v == wson[u]) continue; f[0] = dfs2(v, f[0], 0)[0]; f[1] = dfs2(v, f[1], 0)[1]; } if (op) { for (int i = x; i >= w[u]; --i) { if (i >= w[u]) chkmax(res[u], f[c[u] ^ 1][i - w[u]] + b[u]); } } for (int i = x; i >= w[u]; --i) chkmax(f[c[u]][i], f[c[u] ^ 1][i - w[u]] + b[u]); return f; }
voiddickdreamer(){ std::cin >> n >> x; for (int i = 2; i <= n; ++i) std::cin >> p[i], G[p[i]].emplace_back(i); for (int i = 1; i <= n; ++i) std::cin >> b[i] >> w[i] >> c[i]; dfs1(1); std::vector<int> now(x + 1, -1e18); now[0] = 0; dfs2(1, now, 1); for (int i = 1; i <= n; ++i) std::cout << res[i] << '\n'; }