#include #if __has_include() #endif using namespace std; #define eb emplace_back #define LL(...) ll __VA_ARGS__;lin(__VA_ARGS__) #define RDVL(T,n,...) vec__VA_ARGS__;fe(refs(__VA_ARGS__),e)e.get().resizes(n);lin(__VA_ARGS__) #define RDVV(T,n,...) vec__VA_ARGS__;fe(refs(__VA_ARGS__),e)e.get().resizes(n);vin(__VA_ARGS__) #define VL(n,...) RDVL(ll,n,__VA_ARGS__) #define VV(n,...) RDVV(ll,n,__VA_ARGS__) #define fo(i,...) for(auto[i,i##stop,i##step]=for_range(0,__VA_ARGS__);ivoid pp(const auto&...a){[[maybe_unused]]const char*c="";((o<(a...);} #define entry defpp void main();void main2();}int main(){my::io();my::main();}namespace my{ namespace my{ void io(){cin.tie(nullptr)->sync_with_stdio(0);cout<constexpr auto for_range(T s,T b){T a=0;if(s)swap(a,b);return array{a-s,b,1-s*2};} void lin(auto&...a){(cin>>...>>a);} void vin(auto&...a){fo(i,(a.size()&...))(cin>>...>>a[i]);} constexpr ll size10(auto x){x|=1;ll r=0;while(x>0)x/=10,++r;return r;} templateconstexpr ll maxsize10(){return size10(numeric_limits::max());} bool amin(auto&a,const auto&b){return bstruct pair{ A a;B b; pair()=default; pair(A a,B b):a(a),b(b){} auto operator<=>(const pair&)const=default; }; templatestruct infinity{ templatestatic constexpr T ones(size_t n){return n?ones(n-1)*10+1:0;} templateconstexpr operator T()const{return ones(maxsize10())*(1-is_negative*2);} }; constexpr infinity oo; templateusing pack_back_t=tuple_element_t>; } namespace my{ templateconcept vectorial=is_base_of_v::value_type>,remove_cvref_t>; templateistream&operator>>(istream&i,vector&v){fe(v,e)i>>e;return i;} templateconstexpr int depth=0; templateconstexpr int depth =depth+1; templatestruct core_t_helper{using type=T;}; templatestruct core_t_helper{using type=typename core_t_helper::type;}; templateusing core_t=core_t_helper::type; templatestruct vec; templatestruct hvec_helper{using type=vec::type>;}; templatestruct hvec_helper<0,T>{using type=T;}; templateusing hvec=hvec_helper::type; templatestruct vec:vector{ static constexpr int D=depth+1; using C=core_t; using vector::vector; vec(const auto&...a)requires(sizeof...(a)>=3){resizes(a...);} void resizes(const auto&...a){if constexpr(sizeof...(a)==D)*this=make(a...,C{});else*this=make(a...);} static auto make(ll n,const auto&...a){ if constexpr(sizeof...(a)==1)return vec(n,array{a...}[0]); else return vec(n,make(a...)); } vec&operator--(){fe(*this,e)--e;return*this;} ll size()const{return vector::size();} auto&emplace_front(auto&&...a){this->emplace(this->begin(),std::forward(a)...);return*this;} auto&emplace_back(auto&&...a){vector::emplace_back(std::forward(a)...);return*this;} vec slice(ll l,ll r)const{return lbegin()+l,this->begin()+r):vec{};} templateauto fold(auto&&f)const{ pairres{}; fe(*this,e){ if constexpr(!vectorial){ if(res.b)f(res.a,e); else res={e,1}; }else { } } return res; } templateauto sum()const{return fold([](auto&a,const auto&b){a+=b;}).a;} auto min()const{return fold([](auto&a,auto b){if(brequires(sizeof...(A)>=2)vec(const A&...a)->vec>>; } namespace my{ templatestruct queue:std::queue{ queue()=default; queue(const initializer_list&a){fe(a,e)this->emplace(e);} ll size()const{return std::queue::size();} T pop(){T r=this->front();std::queue::pop();return r;} }; } namespace my{ templatestruct edge{ int from,to; WT wt; int id; edge()=default; edge(int from,int to,WT wt=1,int id=-1):from(from),to(to),wt(wt),id(id){} }; } namespace my{ templateclass RootedTree{ public: ll n_; vec>>edges_; vec>rev_edge_; int root_; RootedTree()=default; RootedTree(ll n,ll r):n_(n),edges_(n),rev_edge_(n,{-1,-1,WT{},-1}),root_(r){} decltype(auto)operator[](ll i){return edges_[i];} void set_edge(const edge&e){ edges_[e.from].eb(e); rev_edge_[e.to]=e; } auto bfs_order(ll start=-1)const{ if(start==-1)start=root_; vecord; queueq{start}; while(q.size()){ ll u=q.pop(); ord.eb(u); fe(edges_[u],e)q.emplace(e.to); } return ord; } }; } namespace my{ templateclass Graph{ public: ll n_; vec>>edges_; Graph()=default; Graph(ll n):n_(n),edges_(n){} auto&add_edges(const vec&p){fo(i,p.size())if(p[i]!=-1)edges_[p[i]].eb(p[i],i,1,i);return*this;} vecbuf; int count=0; auto bfs_tree(int s)const{ RootedTreetree(n_,s); vecused(n_); queue>q{{-1,s,WT{},-1}}; while(q.size()){ auto pu=q.pop(); auto u=pu.to; if(used[u])continue; used[u]=1; if(pu.from!=-1)tree.set_edge(pu); fe(edges_[u],e)if(!used[e.to])q.emplace(e); } return tree; } }; } namespace my{entry void main(){ LL(N,X); VL(N-1,p);--p; p.emplace_front(-1); Graphtmp(N); auto g=tmp.add_edges(p).bfs_tree(0); VV(N-1,c,s); c.emplace_front(0); s.emplace_front(0); vec dp(N,1,ll(oo)); ef(g.bfs_order(),u){ dp[u][0]=0; fe(g[u],e){ ll v=e.to; ll n=dp[u].size(); ll m=dp[v].size(); vec nx(n+m-1,ll(oo)); fo(j,n)fo(k,m)amin(nx[j+k],dp[u][j]+dp[v][k]); swap(dp[u],nx); } vec tmp(dp[u].size()+s[u],ll(oo)); tmp[0]=0; fo(j,dp[u].size())tmp[j+s[u]]=dp[u][j]+c[u]; swap(dp[u],tmp); } pp(dp[0].slice(X,s.sum()+1).min()); }}