Cod sursa(job #1746644)

Utilizator TimitocArdelean Andrei Timotei Timitoc Data 23 august 2016 17:51:34
Problema Cerere Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.1 kb
#include <iostream>
#include <cstdio>
#include <vector>
#include <queue>
#define MAXN 100050

using namespace std;

int n, root;
int k[MAXN], sol[MAXN], parent[MAXN];
vector<int> graf[MAXN];

void citire()
{
    scanf("%d", &n);
    for (int i = 1; i <= n; i++)
        scanf("%d", &k[i]);
    for (int i = 1; i <= n-1; i++) {
        int x, y;
        scanf("%d %d", &x, &y);
        graf[x].push_back(y);
        parent[y] = x;
    }
    for (int i = 1; i <= n; i++)
		if (parent[i] == 0)
			root = i;
}

int stiva[MAXN];
void solve()
{
    int dr = 0;
    stiva[++dr] = root;
    int c = 0;
    while (dr) {
        c++;
        int nod = stiva[dr];
        if (k[nod] == 0)
            sol[nod] = 0;
        else {
            sol[nod] = sol[stiva[dr-k[nod]]] + 1;
        }
        if (graf[nod].empty())
            dr--;
        else {
			stiva[++dr] = graf[nod].back();
            graf[nod].pop_back();
        }
    }
}

int main()
{
    freopen("cerere.in", "r", stdin);
    freopen("cerere.out", "w", stdout);

    citire();
    solve();
    for (int i = 1; i <= n; i++)
        printf("%d ", sol[i]);

    return 0;
}