Cod sursa(job #3205568)

Utilizator Robert_MitriRobert Mitri Robert_Mitri Data 20 februarie 2024 09:39:39
Problema Cerere Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.04 kb
#include <fstream>
#include <vector>
using namespace std;

ifstream fin("cerere.in");
ofstream fout("cerere.out");

int n;

const int nmax = 100000;

vector <int> v[nmax + 5];


int k[nmax + 5];

int p[18][nmax + 5];
int sol[nmax + 5];

int get_k(int nod)
{
    int pr = nod;
    int kk = k[nod];
    for(int j = 17;j>=0;j--)
        if((1<<j)<=kk)
            kk-=(1<<j),pr=p[j][pr];
    return sol[pr];
}


void dfs(int nod)
{
    if(k[nod]==0)
        sol[nod]=0;
    else
        sol[nod]=get_k(nod)+1;
    for(auto& i : v[nod])
        dfs(i);
}
bool viz[nmax + 5];
int main()
{
    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;
        v[x].push_back(y);
        p[0][y]=x;
        viz[y]=true;
    }
    for(int i=1;(1<<i)<=n;i++)
        for(int j=1;j<=n;j++)
            p[i][j]=p[i-1][p[i-1][j]];
    for(int i=1;i<=n;i++)
        if(!viz[i])
            dfs(1);
    for(int i=1;i<=n;i++)
        fout<<sol[i]<<' ';
}