Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include<bits/stdc++.h>
- using namespace std;
- #define gc c=getchar()
- #define r(x) read(x)
- #define ll long long
- template<typename T>
- inline void read(T&x){
- char gc;x=0;
- while(!isdigit(c))gc;
- while(isdigit(c))x=x*10+c-'0',gc;
- }
- const int N=2e5+7;
- int a[N];
- vector<int>G[N];
- priority_queue<int>Q[N];
- int tot;
- int id[N];
- int sta[N];
- void dfs(int x){
- for(int i=0;i<G[x].size();++i){
- int v=G[x][i];
- dfs(v);
- if(i){
- if(Q[id[x]].size()<Q[id[v]].size()){
- swap(id[x],id[v]);
- }
- int top=0;
- while(!Q[id[v]].empty()){
- sta[++top]=max(Q[id[x]].top(),Q[id[v]].top());
- Q[id[x]].pop();
- Q[id[v]].pop();
- }
- for(int i=1;i<=top;++i){
- Q[id[x]].push(sta[i]);
- }
- }
- else {
- id[x]=id[v];
- }
- }
- if(!id[x])id[x]=++tot;
- Q[id[x]].push(a[x]);
- }
- int main(){
- // freopen("spring.in","r",stdin);
- // freopen("spring.out","w",stdout);
- int n;r(n);
- for(int i=1;i<=n;++i){
- r(a[i]);
- }
- for(int i=2;i<=n;++i){
- int x;r(x);
- G[x].push_back(i);
- }
- dfs(1);
- ll ans=0;
- while(!Q[id[1]].empty()){
- ans+=Q[id[1]].top();
- Q[id[1]].pop();
- }
- printf("%lld\n",ans);
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement