Cod sursa(job #2777630)

Utilizator etienAndrone Stefan etien Data 23 septembrie 2021 19:42:38
Problema Cerere Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.21 kb
#include<bits/stdc++.h>
using namespace std;
ifstream fin("cerere.in");
ofstream fout("cerere.out");
int t[18][100001],k[100001],str[100001],nrr[100001];
vector<int>v[100001];
bool viz[100001];
int stramos(int p,int x)
{
    int nr=0;
    while(p)
    {
        if(p%2==1)
            x=t[nr][x];
        p/=2;
        nr++;
    }
    return x;
}
void dfs(int nod,int prt)
{
    viz[nod]=true;
    for(auto q:v[nod])
    {
        if(q!=prt)
        {
            if(k[q])
            {
                nrr[q]=nrr[nod]+1;
            }
            dfs(q,nod);
        }
    }
}
int main()
{
    int n,i,j;
    fin>>n;
    for(i=1;i<=n;i++)
        fin>>k[i];
    for(i=2;i<=n;i++)
    {
        int a,b;
        fin>>a>>b;
        t[0][b]=a;
    }
    for(i=1;i<=17;i++)
    {
        for(j=2;j<=n;j++)
        {
            t[i][j]=t[i-1][t[i-1][j]];
        }
    }
    for(i=1;i<=n;i++)
    {
        str[i]=stramos(k[i],i);
        if(i>1&&i!=str[i])
        {
            v[i].push_back(str[i]);
            v[str[i]].push_back(i);
        }
    }
    for(i=1;i<=n;i++)
        if(!viz[i])
            dfs(i,0);
    for(i=1;i<=n;i++)
        fout<<nrr[i]<<" ";
}