Cod sursa(job #3205562)

Utilizator Robert_MitriRobert Mitri Robert_Mitri Data 20 februarie 2024 09:30:29
Problema Cerere Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 0.97 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 pr;
}


void dfs(int nod)
{
    int nx = nod;
    int nr = 0;
    while(nx!=0 && k[nx]!=0)
        nx=get_k(nx),nr++;
    sol[nod]=nr;
    for(auto& i : v[nod])
        dfs(i);
}

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;
    }
    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]];
    dfs(1);
    for(int i=1;i<=n;i++)
        fout<<sol[i]<<' ';
}