Cod sursa(job #2516184)

Utilizator Rares31100Popa Rares Rares31100 Data 30 decembrie 2019 15:56:55
Problema Cerere Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 0.92 kb
#include <bits/stdc++.h>

using namespace std;

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

int n;
int vf[100001],urm[100001],last[100001],nr;
bitset <100001> noRad;

int toSend[100001];
int nrM[100001];
int stram[100001];

void adauga(int nod,int vec)
{
    vf[++nr]=vec;
    urm[nr]=last[nod];
    last[nod]=nr;
}

void dfs(int nod,int dist=0)
{
    if(toSend[nod]==0)
        nrM[nod]=0;
    else
        nrM[nod]=nrM[ stram[dist-toSend[nod]+1] ]+1;

    stram[dist+1]=nod;

    for(int k=last[nod];k;k=urm[k])
        dfs(vf[k],dist+1);
}

int main()
{
    in>>n;

    for(int i=1;i<=n;i++)
        in>>toSend[i];

    for(int i,j,k=1;k<=n-1;k++)
    {
        in>>i>>j;

        adauga(i,j);
        noRad[j]=1;
    }

    int start=1;
    while(noRad[start]==1)
        start++;

    dfs(start);

    for(int i=1;i<=n;i++)
        out<<nrM[i]<<' ';

    return 0;
}