#include <bits/stdc++.h>
#define rep(i, n) for (int i = 0; i < n; i++)
using namespace std;

typedef long long ll;
typedef unsigned long ul;

int main() {
    int n; //木の頂点の数
    scanf("%d", &n);
    vector<int> p(n, -1), c(n, 1), d(n, 0);
    // p[i]: iの親
    // c[i]: iを根とする部分木の濃度
    // d[i]: iに進んだ時に獲得できる個数
    vector<vector<int>> ch(n);
    // ch[i]: iの子
    rep(i, n - 1) {
        scanf("%d", &p[i + 1]);
        p[i + 1]--;
        ch[p[i + 1]].push_back(i + 1);
    }
    rep(i, n - 1) {
        c[p[n - 1 - i]] += c[n - 1 - i];
    }
    for (int i = n - 1; i >= 0; i--) {
        int epp = 0; //偶数個の木に進んで得するとき取れる数
        int epm = 0; //偶数個の木に進んで得するとき取られる数
        int emp = 0; //偶数個の木に進んで損するとき取れる数
        int emm = 0; //偶数個の木に進んで損するとき取られる数
        vector<pair<int, int>> od(0);
        //奇数個の木に進んだとき(取られる-取れる, 取れる);
        rep(j, ch[i].size()) {
            int u = ch[i][j];
            if (c[u] % 2) {
                od.push_back(make_pair(c[u] - d[u] * 2, d[u]));
            } else {
                if (d[u] > c[u] - d[u]) {
                    epp += d[u];
                    epm += c[u] - d[u];
                } else {
                    emp += d[u];
                    emm += c[u] - d[u];
                }
            }
        }
        if (od.size() == 0) {
            d[i] += epp + emp;
        } else {
            d[i] += epp;
            if (od.size() % 2) {
                d[i] += emm;
            } else {
                d[i] += emp;
            }
            sort(od.begin(), od.end());
            rep(j, od.size()) {
                if (j % 2) {
                    d[i] += od[j].first + od[j].second;
                } else {
                    d[i] += od[j].second;
                }
            }
        }
    }
    printf("%d\n", n - d[0]);
    //rep(i, n) cout << d[i] << " "; cout << "\n";
}
#include <bits/stdc++.h>
using namespace std;
#define F first
#define S second
#define R cin>>
#define ll long long
#define ln cout<<'\n'
#define in(a) insert(a)
#define pb(a) push_back(a)
#define pd(a) printf("%.10f\n",a)
#define mem(a) memset(a,0,sizeof(a))
#define all(c) (c).begin(),(c).end()
#define iter(c) __typeof((c).begin())
#define rrep(i,n) for(ll i=(ll)(n)-1;i>=0;i--)
#define REP(i,m,n) for(ll i=(ll)(m);i<(ll)(n);i++)
#define rep(i,n) REP(i,0,n)
#define tr(it,c) for(iter(c) it=(c).begin();it!=(c).end();it++)
ll check(ll n,ll m,ll x,ll y){return x>=0&&x<n&&y>=0&&y<m;}void pr(){ln;}
template<class A,class...B>void pr(const A &a,const B&...b){cout<<a<<(sizeof...(b)?" ":"");pr(b...);}
template<class A>void PR(A a,ll n){rep(i,n)cout<<(i?" ":"")<<a[i];ln;}
const ll MAX=1e9+7,MAXL=1LL<<61,dx[8]={-1,0,1,0,-1,-1,1,1},dy[8]={0,1,0,-1,-1,1,1,-1};
typedef pair<ll,ll> P;

void Main() {
  ll n;
  R n;
  ll a[n],b[n];
  rep(i,n) R a[i];
  rep(i,n) R b[i];
  ll Ma=0,ans=0;
  rep(i,n) {
    Ma=max(Ma,a[i]);
    ans=max(ans,Ma*b[i]);
    pr(ans);
  }
}

int main(){ios::sync_with_stdio(0);cin.tie(0);Main();return 0;}
