Cod sursa(job #3314992)

Utilizator tudor_costinCostin Tudor tudor_costin Data 11 octombrie 2025 19:18:05
Problema Cerere Scor 90
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1 kb
#include <bits/stdc++.h>

using namespace std;
ifstream fin("cerere.in");
ofstream fout("cerere.out");
const int Nmax=1e5+5;
int up[Nmax][20];
int ans[Nmax],k[Nmax];
vector<int> g[Nmax];
int calcup(int nod)
{
    int cur=nod;
    for(int i=16;i>=0;i--)
    {
        if((1<<i)<=k[nod])
        {
            cur=up[cur][i];
            k[nod]-=(1<<i);
        }
    }
    return cur;
}
void dfs(int nod)
{
    for(int i=1;i<=16;i++) up[nod][i]=up[up[nod][i-1]][i-1];
    if(k[nod]==0)
    {
        ans[nod]=0;
    }
    else
    {
        int prv=calcup(nod);
        ans[nod]=ans[prv]+1;
    }
    for(int u:g[nod]) dfs(u);
}
int main()
{
    int n;
    fin>>n;
    for(int i=1;i<=n;i++) fin>>k[i];
    for(int i=1;i<n;i++)
    {
        int x,y;
        fin>>x>>y;
        g[x].push_back(y);
        up[y][0]=x;
    }
    int R;
    for(int i=1;i<=n;i++) if(up[i][0]==0) R=i;
    up[R][0]=R;
    dfs(R);
    for(int i=1;i<=n;i++) fout<<ans[i]<<' ';
    return 0;
}