提交时间:2024-03-31 17:25:41

运行 ID: 27977

#include<bits/stdc++.h> using namespace std; const int N=1e6+10; int n,fa,v[N],st[N],ans[N],top,pastn,pastt; vector<int> g[N]; void dfs(int x){ int l=1,r=top,op=0,mid; while(l<=r){ mid=(l+r)/2; if(st[mid]<v[x]) r=mid-1,op=mid; else l=mid+1; } if(!op) op=top+1; pastn=st[op],pastt=top; top=op; st[top]=v[x]; ans[x]=top; int len=g[x].size(); for(int i=0;i<len;i++) dfs(g[x][i]); top=pastt; st[op]=pastn; } signed main(){ scanf("%d",&n); for(int i=2;i<=n;i++){ scanf("%d",&fa); g[fa].push_back(i); } for(int i=1;i<=n;i++){ scanf("%d",&v[i]); } top=0; dfs(1); for(int i=1;i<=n;i++){ printf("%d ",ans[i]); } return 0; }