Cod sursa(job #3246100)

Utilizator Ruxandra009Ruxandra Vasilescu Ruxandra009 Data 1 octombrie 2024 20:56:34
Problema Cerere Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.36 kb
#include <algorithm>
#include <fstream>
#include <vector>

using namespace std;

ifstream f("cerere.in");
ofstream g("cerere.out");

const int nmax = 100005;

struct ceva{
int ind, val;
}a[nmax];

int n, intel[nmax], dad[nmax], t[nmax][25], ans[nmax], fr[nmax];
vector<int> v[nmax], ord;

void solve(int nod)
{
    if(!intel[nod])
        ans[nod] = 0;
    else
    {
        int nr = intel[nod], k = nod;
        for(int i = 0; i <= 20; i ++)
            if((1<<i)&nr)
                k = t[k][i];

        ans[nod] = 1 + ans[k];
    }
}

void dfs(int nod)
{
    fr[nod] = 1; ord.push_back(nod);
    for(auto x : v[nod])
        if(!fr[x])
            dfs(x);
}

int main()
{
    f >> n;
    for(int i = 1; i <= n; i ++)
        f >> intel[i];

    for(int i = 1; i < n; i ++)
    {
        int x, y;
        f >> x >> y;
        dad[y] = x;
        v[x].push_back(y);
    }

    int r = 0;
    for(int i = 1; i <= n; i ++)
        if(!dad[i])
            r = i;

    ord.push_back(0);
    dfs(r);

    for(int i = 1; i <= n; i ++)
    {
        int k = ord[i];
        t[k][0] = dad[k];
        for(int x = 1; x <= 20; x ++)
            t[k][x] = t[t[k][x - 1]][x - 1];
    }

    for(int i = 1; i <= n; i ++)
        solve(ord[i]);

    for(int i = 1; i <= n; i ++)
        g << ans[i] << " ";
    return 0;
}