提交时间:2020-11-16 16:54:20

运行 ID: 1878

#include<bits/stdc++.h> #define ll long long using namespace std; const int N=1e6+10; ll n; ll fa[N],val[N],ans[N]; struct edge { ll to,next; }e[N<<4]; ll head[N],tot; void add(int u,int v) { e[++tot]={v,head[u]}; head[u]=tot; } ll st[N<<2],tp; ll find(ll l,ll r,ll v){ while(l<=r){ ll mid=(l+r)/2; if(st[mid]>=v){ l=mid+1; } else r=mid-1; } return l; } void dfs(int p) { for(ll i=head[p];i;i=e[i].next) { ll v=e[i].to; if(v!=fa[p]) { ll tmp=0,id=0,cnt=tp; if(val[v]>st[tp]) { id=find(1,tp,val[v]); tmp=st[id]; st[id]=val[v]; tp=id; } else { tmp=st[tp+1]; st[++tp]=val[v]; id=tp; } dfs(v); if(tmp!=0 && id!=0) st[id]=tmp; tp=cnt; } } ans[p]=tp; } int main() { scanf("%lld",&n); for(ll i=2;i<=n;i++) { scanf("%lld", &fa[i]); add(fa[i],i); } for(ll i=1;i<=n;i++) scanf("%lld",&val[i]); st[++tp]=val[1]; dfs(1); for(ll i=1;i<=n;i++) printf("%lld ",ans[i]); return 0; }