提交时间:2024-03-31 16:03:33
运行 ID: 27941
#include<bits/stdc++.h> using namespace std; const int N = 1e6+10; int n,f[N],v[N],ans[N],vis[N],dep[N]; vector<int> G[N]; int q[N],R=1; void dfs(int x){ ans[x]=R; for(int i=0;i<G[x].size();i++){ int y=G[x][i]; int lastlen=R,p=-1,lastp=-1; if(v[y]<q[R]){ int l=1,r=R; while(l<=r){ int mid=(l+r)/2; if(q[mid]<v[y]){ r=mid-1; } else l=mid+1; } lastp=q[l]; p=l; q[p]=v[y]; R=p; } else{ p=R+1; lastp=q[p]; q[p]=v[y]; } dfs(y); if(p!=-1&&lastp!=-1){ q[p]=lastp; } R=lastlen; } } int main(){ cin>>n; for(int i=2;i<=n;i++){ cin>>f[i]; G[f[i]].push_back(i); } for(int i=1;i<=n;i++){ cin>>v[i]; } q[1]=v[1]; dfs(1); for(int i=1;i<=n;i++){ cout<<ans[i]<<" "; } cout<<endl; return 0; }