Cod sursa(job #1932773)

Utilizator BugirosRobert Bugiros Data 20 martie 2017 09:04:24
Problema Cerere Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.39 kb
#include <cstdio>
#include <vector>
using namespace std;

const int MAXN = 100006;

vector<int> fii[MAXN];
int k[MAXN];
int n;

bool are_tata[MAXN];

void citire()
{
    freopen("cerere.in","r",stdin);
    freopen("cerere.out","w",stdout);
    scanf("%d",&n);
    for (int i = 1;i <= n;++i)
        scanf("%d",&k[i]);
    for (int i = 1;i < n;++i)
    {
        int a,b;
        scanf("%d%d",&a,&b);
        are_tata[b] = true;
        fii[a].push_back(b);
    }
}

int stiva[MAXN];
int l_stiva;

int rasp[MAXN];
int indice_fiu[MAXN];

void prelucrare()
{
    for (int i = 1;i <= n;++i)
    {
        rasp[i] = -1;
        indice_fiu[i] = -1;
        if (!are_tata[i])
            stiva[l_stiva = 1] = i;
    }

    while(l_stiva >= 1)
    {
        //calculare raspuns pentru acest nod
        int nod = stiva[l_stiva];
        if (rasp[nod] == -1)
        {
            rasp[nod] = 0;
            if (k[nod] != 0)
                rasp[nod] = rasp[stiva[l_stiva - k[nod]]] + 1;
        }

        ++indice_fiu[nod];
        if(indice_fiu[nod] < fii[nod].size())
            stiva[++l_stiva] = fii[nod][indice_fiu[nod]];
        else --l_stiva;
    }
}

inline void afisare()
{
    for (int i = 1;i < n;++i)
        printf("%d ",rasp[i]);
    printf("%d\n",rasp[n]);
}

int main()
{
    citire();
    prelucrare();
    afisare();
    return 0;
}