Cod sursa(job #2663092)

Utilizator bogdi1bogdan bancuta bogdi1 Data 25 octombrie 2020 12:36:03
Problema Cerere Scor 0
Compilator cpp-32 Status done
Runda Arhiva de probleme Marime 1.13 kb
#include <cstdio>
#include <vector>
using namespace std;
vector<int> g[100005];
bool viz[100005];
int stramos[20][100005];
int sol[100005];
int v[100005];
void dfs(int nod)
{
    viz[nod]=1;
    if(v[nod]==0)
        sol[nod]=0;
    else{
        int pas=19;
        int k=v[nod];
        int nodd=nod;
        while(k){
            if(k>=(1<<pas)){
                k-=(1<<pas);
                nodd=stramos[pas][nodd];
            }
            pas--;
        }
        sol[nod]=sol[nodd]+1;
    }
    for(int i=0; i<g[nod].size(); i++)
        if(viz[g[nod][i]]==0)
            dfs(g[nod][i]);
}
int main()
{   freopen("cerere.in", "r", stdin);
    freopen("cerere.out", "w", stdout);
    int n,i,x,y,j;
    scanf("%d", &n);
    for(i=1; i<=n; i++)
        scanf("%d", &v[i]);
    for(i=1; i<n; i++){
        scanf("%d%d", &x, &y);
        g[x].push_back(y);
        g[y].push_back(x);
        stramos[0][y]=x;
    }
    for(i=1; i<20; i++)
        for(j=1; j<=n; j++)
            stramos[i][j]=stramos[i-1][stramos[i-1][j]];
    dfs(1);
    for(i=1; i<=n; i++)
        printf("%d ", sol[i]);
    return 0;
}