Cod sursa(job #1744149)

Utilizator mariakKapros Maria mariak Data 19 august 2016 13:14:39
Problema Cerere Scor 45
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.68 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], anc[17][Nmax], sol[Nmax], root, Anc[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)
{
    if(!K[x])
        sol[x] = 0;
    else
        sol[x] = sol[Anc[x]] + 1;
    vis.set(x);

    for(int i = 0; i < G[x].size(); ++ i)
    {
        int y = G[x][i];
        if(!vis.test(y))
            DFS(y);
    }
}
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(k = 0; (1 << k) <= n; ++ k)
        for(i = 1; i <= n; ++ i)
        {
            if(k == 0)
            {
                scanf("%d %d", &x, &y);
                anc[0][y] = x;
                no_root.set(y);
                G[x].pb(y);
                continue;
            }
            if(anc[k - 1][i])
                anc[k][i] = anc[k - 1][anc[k - 1][i]];
        }

    Find_Root();

    for(i = 1; i <= n; ++ i)
    {
        node = i;
        p = K[i];
        if(!K[i]) continue;
        for(k = 0; (1 << k) <= p; ++ k)
        {
            if((1 << k) & K[i])
                node = anc[k][node];
            if(!p) break;
        }
        Anc[i] = node;
    }

    DFS(root);

    write();
    return 0;
}