提交时间:2020-11-16 13:47:39
运行 ID: 1845
#include <bits/stdc++.h> using namespace std; char buf[1 << 21], *p1 = buf, *p2 = buf; inline char getc(){ return p1 == p2 && (p2 = (p1 = buf) + fread(buf, 1, 1 << 21, stdin), p1 == p2) ? EOF : *p1++; } inline void read(int &x){ x = 0; char s = getc(); while(s < '0' || s > '9') s = getc(); while('0' <= s && s <= '9'){ x = (x << 3) + (x << 1) + (s ^ 48); s = getc(); } } void print(const int &x){ if(x > 9) print(x / 10); putchar(x % 10 + '0'); } const int N = 1000010; int n, fa[N], val[N]; int head[N], cnt, ans[N]; struct node{ int to, next; }e[N << 1]; inline void add(int x, int y){ e[++cnt].to = y; e[cnt].next = head[x]; head[x] = cnt; } int q[N]; void dfs(int now, int pos){ //第一个小于等于的位置 if(!pos || q[pos] >= val[now]){ q[++pos] = val[now]; ans[now] = pos; for(int i = head[now];i;i = e[i].next){ int v = e[i].to; dfs(v, pos); } }else{ int l = 1, r = pos; while(l <= r){ int mid = ((l + r) >> 1); if(q[mid] >= val[now]) l = mid + 1; else r = mid - 1; } int tmp = q[r + 1]; q[r + 1] = val[now]; ans[now] = r + 1; for(int i = head[now];i;i = e[i].next){ int v = e[i].to; dfs(v, r + 1); } q[r + 1] = tmp; } } int main() { read(n); for(int i = 2;i <= n;i++){ read(fa[i]); add(fa[i], i); } for(int i = 1;i <= n;i++) read(val[i]); dfs(1, 0); for(int i = 1;i <= n;i++) print(ans[i]), putchar(' '); return 0; }