/* Look at me! Look at me! Look at how large the monster inside me has become! */ #include #include #include #include #include #include #define FIT(a,b) for(vector::iterator a=b.begin();a!=b.end();a++) #define FITP(a,b) for(vector >::iterator a=b.begin();a!=b.end();a++) #define RIT(a,b) for(vector::reverse_iterator a=b.end();a!=b.begin();++a) #include #define ROF(a,b,c) for(int a=b;a>=c;--a) #include #include #define FOR(a,b,c) for(int a=b;a<=c;++a) #define REP(a,b) for(register int a=0;a #include #include #include #define f cin #define g cout #include #define INF 0x3f3f3f3f #define debug cerr<<"OK"; #define pii pair #define mp make_pair #define pb push_back #define fi first #define se second #define ld long double #define ll long long #define ull unsigned long long #define eps 1.e-7 #define BUFMAX 10100100 #define M 100100 #define N 200100 #define NM 2000100 #define mod 1000000007 #define eps 1.e-10 using namespace std; /* int dx[]={-1,-1,-1,0,1,1,1,0}; int dy[]={-1,0,1,1,1,0,-1,-1}; */ vector v[N]; pair A[N],B[N]; ll sol[N],a[N],b[N]; int nr[N],poz[N],r[N],te; int H[NM],rig[NM],lef[NM],R[NM],nor[N],nods,aux; int x,n,arb[N]; void find(int nod,int st,int dr,int l,int r) { if(st>=l&&dr<=r) { aux+=H[nod]; return ; } int mij=(st+dr)>>1; if(l<=mij) find(lef[nod],st,mij,l,r); if(r>mij) find(rig[nod],mij+1,dr,l,r); } void df(int x) { ++te; poz[x]=te; r[x]=te; FIT(it,v[x]) { df(*it); r[x]=max(r[x],r[*it]); } } void dfs(int x) { if(a[x]<=b[x]) nr[x]=1; FIT(it,v[x]) dfs(*it); sol[x]=nr[x]; FIT(it,v[x]) { int er=*it; aux=0; find(R[nor[x]],1,n,poz[*it],r[*it]); sol[x]+=1LL*aux*nr[x]*2; nr[x]+=aux; } } void atr(int x,int y) { lef[x]=lef[y]; rig[x]=rig[y]; H[x]=H[y]; } void upd(int nod,int old,int st,int dr,int p) { if(st==dr) { H[nod]++; return ; } int mij=(st+dr)>>1; if(p<=mij) { ++nods; lef[nod]=nods; atr(lef[nod],lef[old]); upd(lef[nod],lef[old],st,mij,p); } else { ++nods; rig[nod]=nods; atr(rig[nod],rig[old]); upd(rig[nod],rig[old],mij+1,dr,p); } H[nod]=H[lef[nod]]+H[rig[nod]]; } int main () { #ifndef ONLINE_JUDGE freopen("a.in","r",stdin); freopen("a.out","w",stdout); #endif f>>n; FOR(i,2,n) { f>>x; v[x].pb(i); } FOR(i,1,n) { f>>a[i]; A[i].fi=a[i]; A[i].se=i; } sort(A+1,A+n+1); FOR(i,1,n) { f>>b[i]; B[i].fi=b[i]; B[i].se=i; } sort(B+1,B+n+1); df(1); int p=0; FOR(i,1,n) { while(p!=n&&A[p+1].fi<=B[i].fi) { ++p; R[p]=++nods; atr(R[p],R[p-1]); upd(R[p],R[p-1],1,n,poz[A[p].se]); } nor[B[i].se]=p; } dfs(1); FOR(i,1,n) g<