Cod sursa(job #1746634)

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

using namespace std;

int n;
int k[MAXN], sol[MAXN];
vector<int> graf[MAXN];
queue<int> arb[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);
        graf[y].push_back(x);
    }
}

void agat(int parent, int nod)
{
    for (int i = 0; i < graf[nod].size(); i++) {
        if (graf[nod][i] != parent) {
			arb[nod].push(graf[nod][i]);
			agat(nod, graf[nod][i]);
        }
    }
}

int stiva[MAXN];
void solve()
{
	int dr = 0;
	stiva[++dr] = 1;
    while (dr) {
        int nod = stiva[dr];
        if (k[nod] == 0)
			sol[nod] = 0;
        else {
			sol[nod] = sol[stiva[dr-k[nod]]] + 1;
        }
        if (arb[nod].empty())
			dr--;
        else {
            stiva[++dr] = arb[nod].front();
            arb[nod].pop();
        }
    }
}

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

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

    return 0;
}