Cod sursa(job #3159722)

Utilizator AswVwsACamburu Luca AswVwsA Data 21 octombrie 2023 20:59:22
Problema Cerere Scor 85
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.07 kb
//oftica si durere in suflet
#include <fstream>
#include <cmath>
#include <algorithm>
#define ll long long

using namespace std;

const int NMAX = 1e5;
const int LGMAX = 18;

int d[NMAX + 1][LGMAX + 1];
int lg[NMAX + 1];
int cat[NMAX + 1];
int jump(int nod, int pas)
{
    int i, ans = nod;
    for (i = 0; (1 << i) <= pas; i++)
        if (pas & (1 << i))
            ans = d[ans][i];
    return ans;
}

signed main()
{
    ifstream cin("cerere.in");
    ofstream cout("cerere.out");
    int n, i, j;
    cin >> n;
    for (i = 1; i <= n; i++)
    {
        cin >> cat[i];
    }
    for (i = 2; i <= n; i++)
    {
        int a, b;
        cin >> a >> b;
        d[b][0] = a;

        lg[i] = lg[i / 2] + 1;
    }
    for (i = 1; i <= lg[n]; i++)
        for (j = 1; j <= n; j++)
            d[j][i] = d[d[j][i - 1]][i - 1];
    for (i = 1; i <= n; i++)
    {
        int ax = i;
        int cnt = 0;
        while (cat[ax])
        {
            ax = jump(ax, cat[ax]);
            cnt++;
        }
        cout << cnt << " ";
    }
}