Cod sursa(job #1744249)

Utilizator mariakKapros Maria mariak Data 19 august 2016 15:06:37
Problema Cerere Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.23 kb
#include <bits/stdc++.h>
#define Nmax 100002
#define pb(x) push_back(x)
FILE *fin  = freopen("cerere.in", "r", stdin);
FILE *fout = freopen("cerere.out", "w", stdout);

using namespace std;
int n, K[Nmax], sol[Nmax], root, stk[Nmax];
bitset <Nmax> vis, no_root;
vector <int> G[Nmax];
void Find_Root()
{
    for(int i = 1; i <= n; ++ i)
        if(!no_root.test(i))
        {
            root = i;
            break;
        }
}
void DFS(int x)
{
    int pos = stk[0];
    if(!K[x])
        sol[x] = 0;
    else
        sol[x] = sol[stk[pos - K[x]]] + 1;
    vis.set(x);

    for(int i = 0; i < G[x].size(); ++ i)
    {
        int y = G[x][i];
        if(!vis.test(y))
        {
            stk[++ stk[0]] = y;
            DFS(y);
        }
    }
    -- stk[0];
}
void write()
{
    for(int i = 1; i <= n; ++ i)
        printf("%d ", sol[i]);
    printf("\n");
}
int main()
{
    int i, k, node, x, y, p;
    scanf("%d", &n);

    for(i = 1; i <= n; ++ i)
        scanf("%d", &K[i]);

    for(i = 1; i <= n; ++ i)
    {
        scanf("%d %d", &x, &y);
        no_root.set(y);
        G[x].pb(y);
    }

    Find_Root();
    stk[++ stk[0]] = root;
    DFS(root);

    write();
    return 0;
}