Cod sursa(job #2955654)

Utilizator PHOSSESSEDProsie Radu-Teodor PHOSSESSED Data 17 decembrie 2022 16:03:12
Problema Cerere Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.56 kb
#include<fstream>
#include<vector>
using namespace std;

ifstream fin("cerere.in");
ofstream fout("cerere.out");

const int NMAX = 1e5 + 1;
const int MAXLOG = 18;

int t[NMAX],k[NMAX],dp[NMAX],lift[MAXLOG][NMAX];//lift[i][j] = al 2 ^ i ulea stramos al lui j

vector<int> fii[NMAX];

bool rad[NMAX];

void blift(int n)
{
    for(int i = 1; i <= n ; i++) lift[0][i] = t[i];
    for(int i = 1; (1 << i) <= n ; i++)
        {
            for(int j = 1; j <= n ; j++)
                {
                    lift[i][j] = lift[i - 1][lift[i - 1][j]];
                }
        }
}

int query(int nod,int anc)
{
    for(int i = 0 ; i < MAXLOG ; i++)
        {
            if(anc & (1 << i))
                nod = lift[i][nod];
        }

    return nod;
}

void dinamica(int nod)
{
    if(k[nod] == 0)
        {
            dp[nod] = 0;
        }

    else
        {
            dp[nod] = 1 + dp[query(nod,k[nod])];
        }

    for(auto it : fii[nod])
        dinamica(it);
}

int main()
{
    int n,a,b; fin >> n;
    for(int i = 1; i <= n ; i++) fin >> k[i];
    for(int i = 1; i < n ; i++)
        {
            fin >> a >> b;
            rad[b] = 1;
            t[b] = a;
            fii[a].push_back(b);
        }

    blift(n);
    int root = -1;
    for(int i = 1; i <= n ; i++)
        {
            if(!rad[i])
                {
                    root = i;
                    break;
                }

        }

    dinamica(root);
    for(int i = 1; i <= n ; i++) fout << dp[i] << " ";

    return 0;
}