提交时间:2024-03-31 18:43:28
运行 ID: 27988
#include<bits/stdc++.h> using namespace std; #define int long long const int MAXN=1000010; int n,p[MAXN],stk[MAXN],top,ans[MAXN]; struct Edge{int v,nxt;}e[MAXN];int h[MAXN],cnt; void add_side(int u,int v){e[++cnt]={v,h[u]};h[u]=cnt;} int find_place(int x){ int l=1,r=top; while(l<r){ int mid=(l+r)>>1; if(stk[mid]>=x)l=mid+1; else r=mid; } if(stk[l]<x)return l; return top+1; } void dfs(int x){ ans[x]=top; for(int i=h[x],v=e[i].v;i;i=e[i].nxt,v=e[i].v){ int k=find_place(p[v]); int lnt=stk[k],ltop=top; stk[k]=p[v];top=k; dfs(v); stk[k]=lnt;top=ltop; } } signed main(){ scanf("%lld",&n); for(int i=2;i<=n;i++){ int fa;scanf("%lld",&fa); add_side(fa,i); } for(int i=1;i<=n;i++)scanf("%lld",&p[i]); stk[++top]=p[1]; dfs(1); for(int i=1;i<=n;i++){ cout<<ans[i]<<" "; } return 0; }