Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- using namespace std;
- const int N=1e5+10;
- const int BIT_SIZE=1e5+5;
- int a[N];
- pair<int, int> p[N];
- vector<int> g[N];
- int sol[N], t;
- int bit[BIT_SIZE];
- int lson[N], rson[N];
- int n;
- struct Query
- {
- int pos, type, val, idx;
- bool operator<(const Query &qv) const
- {
- if (pos==qv.pos) return type<qv.type;
- return pos<qv.pos;
- }
- };
- vector<Query> q;
- void update (int x, int val)
- {
- while (x<=BIT_SIZE)
- {
- bit[x]+=val;
- x+=x&-x;
- }
- }
- int get (int x)
- {
- int ret=0;
- while (x>0)
- {
- ret+=bit[x];
- x-=x&-x;
- }
- return ret;
- }
- void compress ()
- {
- sort (p+1, p+n+1);
- int last=0, k=0;
- for (int i=1;i<=n;i++)
- {
- if (p[i].first==last) a[p[i].second]=k;
- else a[p[i].second]=++k;
- last=p[i].first;
- }
- }
- int dfs (int v, int prev)
- {
- lson[v]=rson[v]=++t;
- q.push_back({lson[v], 1, a[v], 0});
- for (auto xt: g[v])
- {
- if (xt==prev) continue;
- rson[v]=dfs(xt, v);
- }
- return rson[v];
- }
- int main()
- {
- freopen("promote.in", "r", stdin);
- freopen("promote.out", "w", stdout);
- scanf ("%d", &n);
- for (int i=1;i<=n;i++)
- {
- scanf ("%d", &a[i]);
- p[i]=make_pair(a[i], i);
- }
- compress();
- for (int i=2;i<=n;i++)
- {
- int x;
- scanf ("%d", &x);
- g[i].push_back(x);
- g[x].push_back(i);
- }
- dfs (1, 0);
- for (int i=1;i<=n;i++)
- {
- q.push_back({lson[i], 0, a[i], i});
- q.push_back({rson[i], 2, a[i], i});
- }
- sort (q.begin(), q.end());
- for (int i=0;i<q.size();i++)
- {
- Query xt=q[i];
- if (xt.type==1) update (xt.val, 1);
- if (xt.type==0) sol[xt.idx]-=get(xt.val);
- if (xt.type==2) sol[xt.idx]+=get(xt.val);
- }
- for (int i=1;i<=n;i++) printf ("%d\n", rson[i]-lson[i]+1-sol[i]);
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement