Cod sursa(job #2794976)

Utilizator CaptnBananaPetcu Tudor CaptnBanana Data 5 noiembrie 2021 19:18:48
Problema Cerere Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 0.97 kb
#include <bits/stdc++.h>

using namespace std;

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

const int N = 1e5 + 1;
int n, k[N], x, y, ans[N], tata[N], stramos[N];
int vf[N], urm[N], lst[N], nr;

void adauga(int x, int y){
    nr++;
    vf[nr] = y;
    urm[nr] = lst[x];
    lst[x] = nr;
}

void dfs(int nod, int distDeLaRadacina){
    int y;
    stramos[distDeLaRadacina] = nod;
    ans[nod] = ans[stramos[distDeLaRadacina - k[nod]]] + 1;
    for(int i = lst[nod], y = vf[i]; i != 0; i = urm[i], y = vf[i])
        dfs(y, distDeLaRadacina + 1);
}

int main(){
    f >> n;
    for(int i = 1; i <= n; i++){
        ans[i] = -1;
        f >> k[i];
    }

    for(int i = 1; i < n; i++){
        f >> x >> y;
        tata[y] = x;
        adauga(x, y);
    }

    f.close();
    for(int i = 1; i <= n; i++){
        if(tata[i] == 0)
            dfs(i, 0);
    }

    for(int i = 1; i <= n; i++)
        g << ans[i] << ' ';

    g.close();
}