Cod sursa(job #1781173)

Utilizator blackoddAxinie Razvan blackodd Data 16 octombrie 2016 18:37:19
Problema Cerere Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.87 kb
#include <fstream>
#include <vector>
using namespace std;

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

#define MaxN 100001
#define pb push_back

int n, root = 1, top, x, y;
int k[MaxN], t[MaxN], _stack[MaxN], nr[MaxN];
vector<int> G[MaxN];

void Df(int, int);

int main()
{
    fin >> n;

    for ( int i = 1; i <= n; ++i )
        fin >> k[i];

    while( fin >> x >> y ) {
        G[x].pb(y);
        t[y] = x;
    }

    while(t[root] != 0)
        root = t[root];

    Df(root, 0);

    for ( int i = 1; i <= n; ++i )
        fout << nr[i] << ' ';

    fin.close();
    fout.close();
    return 0;
}

void Df(int nod, int lvl) {

    _stack[top++] = nod;

    if ( k[nod] )
        nr[nod] = nr[_stack[lvl-k[nod]]] + 1;
    else
        nr[nod] = 0;

    for ( auto i : G[nod] )
        Df(i, lvl + 1);

    top--;

}