Cod sursă (job #816562)

Utilizator avatar AndiR Tanasescu Andrei Rares AndiR IP ascuns
Problemă Complexat Compilator cpp-32 | 2,18 kb
Rundă Arhiva de probleme Status evaluat
Dată 27 mar. 2025 19:49:30 Scor 0
// Author: Tanasescu Andrei-Rares
/*
     █████╗  ██████╗ ████████╗
    ██╔══██╗ ██╔══██╗╚══██╔══╝
    ███████║ ██████╔╝   ██║   
    ██╔══██║ ██╔══██╗   ██║   
    ██║  ██║ ██║  ██║   ██║   
    ╚═╝  ╚═╝ ╚═╝  ╚═╝   ╚═╝   
*/
#include <iostream>
#include <fstream>
#include <algorithm>
#include <cmath>
#include <map>
#include <unordered_map>
#include <set>
#include <unordered_set>
#include <queue>
#include <stack>
#include <deque>
#include <iomanip>
#include <vector>
#include <cassert>

#pragma GCC optimize("O3")

#define fi first
#define se second
#define pb push_back
#define pf push_front

using namespace std;

ifstream fin ("");
ofstream fout ("");

typedef long long ll;
typedef pair<int, int> pii;
typedef pair<ll, ll> pll;

const ll Nmax=3e5+5, inf=1e9+5;

int n, root;
pii v[Nmax];
int sol[Nmax];
vector<int> ad[Nmax];

int crt;
int in[Nmax], out[Nmax];

void dfs(int node, int p){
    in[node]=++crt;

    for (auto it:ad[node])
        if (it!=p)
            dfs(it, node);
        
    out[node]=crt;
}

struct AIB{
    int v[Nmax];

    inline void add(int pos){
        while (pos<Nmax){
            v[pos]++;
            pos+=pos&-pos;
        }
    }

    inline int query(int pos){
        int sum=0;
        while (pos>0){
            sum+=v[pos];
            pos-=pos&-pos;
        }
        return sum;
    }
    inline int query(int l, int r){
        return query(r)-query(l-1);
    }
}aib;

int main()
{
    ios::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);

    cin>>n;
    for (int i=0; i<n; i++){
        cin>>v[i].fi;
        v[i].se=i+1;
    }

    for (int i=1; i<=n; i++){
        int p;
        cin>>p;

        if (p==0)
            root=i;
        else{
            ad[i].pb(p);
            ad[p].pb(i);
        }
    }

    dfs(root, 0);
    sort(v, v+n);

    for (int i=n-1; i>=0; i--){
        sol[v[i].se]=aib.query(in[v[i].se], out[v[i].se]);
        aib.add(in[v[i].se]);
    }

    for (int i=1; i<=n; i++)
        cout<<sol[i]<<' ';


    return 0;
}