Cod sursa(job #62922)

Utilizator crawlerPuni Andrei Paul crawler Data 24 mai 2007 23:43:43
Problema Cerere Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.5 kb
#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;
   }

  h[sef^n] = 1;
  q.push(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;
 }