Cod sursa(job #3368650)

Utilizator yellowGreenFatu Mihai yellowGreen Data 15 octombrie 2026 10:28:11
Problema Cerere Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.23 kb
#include <fstream>
#include <vector>

using namespace std;
ifstream cin("cerere.in");
ofstream cout("cerere.out");
int n,r,N;
int anc[19][100005];
vector<int> t;
vector<int> G,nxt,top,A,grad,dp;
int idx;
void add_edge(int x,int y)
{
    idx++;
    G[idx]=y;
    nxt[idx]=top[x];
    top[x]=idx;
}
void _dfs(int x,int tata)
{
    anc[0][x]=tata;
    for(int i=top[x];i;i=nxt[i])
    {
        int y=G[i];
        if(y==tata)
            continue;
        _dfs(y,x);
    }
}
void dfs(int x,int tata)
{
    if(A[x]==0)
        dp[x]=0;
    else
        dp[x]=1+dp[t[N-A[x]]];
    for(int i=top[x];i;i=nxt[i])
    {
        int y=G[i];
        if(y==tata)
            continue;
        t.push_back(x);
        N++;
        dfs(y,x);
        N--;
        t.pop_back();
    }
}
int main()
{
    cin>>n;
    A=top=grad=dp=vector<int>(n+1);
    G=nxt=vector<int>(2*n+1);
    for(int i=1;i<=n;i++)
        cin>>A[i];
    for(int i=1;i<=n-1;i++)
    {
        int x,y;
        cin>>x>>y;
        add_edge(x,y);
        grad[y]++;
    }
    for(int i=1;i<=n;i++)
        if(!grad[i])
            r=i;
    _dfs(r,0);
    dfs(r,0);
    for(int i=1;i<=n;i++)
        cout<<dp[i]<<" ";
    return 0;
}