提交时间:2020-11-16 14:30:44
运行 ID: 1848
#include<bits/stdc++.h> #define LL long long using namespace std; int n; struct node{ int to; int next; }edge[1000005]; int head[1000005]; int cnt; void add(int u,int v){ edge[++cnt].to=v; edge[cnt].next=head[u]; head[u]=cnt; return ; } LL val[1000005]; LL sta[1000005]; LL top[1000005]; void dfs(int x){ LL push; LL back; if(x==1){ sta[++top[x]]=val[x]; } else{ LL l=1,r=top[x],ans=0; while(l<=r){ LL mid=(l+r)>>1; if(sta[mid]>val[x]) ans=mid,l=mid+1; else r=mid-1; } top[x]=ans+1; push=top[x]; back=sta[push]; sta[push]=val[x]; } for(int i=head[x];i;i=edge[i].next){ int v=edge[i].to; top[v]=top[x]; dfs(v); } if(x!=1) sta[push]=back; } int main(){ cin>>n; int id; for(int i=2;i<=n;i++){ scanf("%d",&id); add(id,i); } for(int i=1;i<=n;i++){ scanf("%lld",&val[i]); } dfs(1); for(int i=1;i<=n;i++){ printf("%lld ",top[i]); } cout<<endl; return 0; }