Pagini recente » Cod sursa (job #877142) | Clasamentul arhivei Infoarena Monthly | Cod sursa (job #1987937) | Cod sursa (job #2380576) | Cod sursa (job #1744149)
#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;
}