Pagini recente » Cod sursa (job #1034622) | Cod sursa (job #2626102) | Cod sursa (job #2588349) | Cod sursa (job #881610) | Cod sursa (job #62921)
Cod sursa(job #62921)
#include <cstdio>
#include <vector>
#include <bitset>
#include <queue>
using namespace std;
#define Nmax 100100
#define Hmax 22
#define pow(q) (1<<(q))
int up[Nmax], t[Nmax][Hmax], h[Nmax], nr[Nmax];
vector<int> l[Nmax], rez[Nmax];
queue<int> q;
bitset<Nmax> poate;
int luke_i_am_your_father(int nod,int go)
{
// printf("al %d - lea stamos a lui %d este ",go, nod);
for(int i=Hmax-1;i>=0 && go > 0;--i)
if(go >= pow(i))
nod = t[nod][i], go -= pow(i);
// printf("%d\n",nod);
return nod;
}
int main()
{
freopen("cerere.in","r",stdin);
freopen("cerere.out","w",stdout);
int n, i, a,b;
scanf("%d", &n);
for(i=1;i<=n;++i)
{
scanf("%d",up+i);
if(up[i] == 0)
poate[i] = 1;
}
int sef = 0;
for(i=1;i<n;++i)
{
scanf("%d%d",&a,&b);
t[b][0] = a;
l[a].push_back(b);
sef^= i^b;
}
q.push(sef^n);
printf("%d \n", sef^n);
int nod;
while(!q.empty())
{
nod = q.front();
q.pop();
for(i=0;i<l[nod].size();++i)
{
h[l[nod][i]] = h[nod] + 1;
if(poate[l[nod][i]] == 0)
rez[h[l[nod][i]]].push_back(l[nod][i]);
q.push(l[nod][i]);
}
}
int j;
for(j=1;j<Hmax;++j)
for(i=1;i<=n;++i)
t[i][j] = t[t[i][j-1]][j-1];
for(i=1;i<=n;++i)
for(j=0;j<rez[i].size();++j)
nr[rez[i][j]] = nr[luke_i_am_your_father(rez[i][j],up[rez[i][j]])] + 1;
for(i=1;i<=n;++i)
printf("%d ",nr[i]);
printf("\n");
return 0;
}