提交时间:2024-03-31 09:51:16
运行 ID: 27829
#include <bits/stdc++.h> #define int long long #define pii pair<int, int> #define mkp make_pair using namespace std; int n, fa[1000005], mx[1000005], val[1000005], res[1000005]; bool hs[1000005], chain = 1; struct ii { int x; ii(int xx) { x = xx; } bool operator < (const ii i) const { return x > i.x; } }; vector <ii> lst; signed main() { scanf("%lld", &n); for (int i = 2; i <= n; i++) { scanf("%lld", &fa[i]); hs[fa[i]] = 1; if (fa[i] != i - 1) chain = 0; } for (int i = 1; i <= n; i++) scanf("%lld", &val[i]); if (chain || n >= 20000) { for (int i = 1; i <= n; i++) { int p = upper_bound(lst.begin(), lst.end(), ii(val[i])) - lst.begin(); while (lst.size() > p) lst.pop_back(); lst.push_back(val[i]); printf("%lld ", lst.size()); } return 0; } for (int i = 1; i <= n; i++) { mx[i] = val[i]; res[i]++; for (int j = fa[i]; j; j = fa[j]) if (val[j] >= mx[i]) mx[i] = val[j], res[i]++; printf("%lld ", res[i]); } return 0; }