Cod sursa(job #62920)

Utilizator crawlerPuni Andrei Paul crawler Data 24 mai 2007 23:28:16
Problema Cerere Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.32 kb
#include <cstdio>
#include <queue>
#include <vector>

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;

int luke_i_am_your_father(int nod,int go)
 {
  for(int i=Hmax-1;i>=0 && go > 0;--i)
   if(go >= pow(i))
    nod = t[nod][i], go -= pow(i);
 
  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)
     {
      q.push(i);
      h[i] = 1;
     }
   }

  for(i=1;i<Nmax;++i)
   {
    scanf("%d%d",&a,&b);
    t[b][0] = a;
    l[a].push_back(b);
   }

  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;
      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];


  nr[0] = -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;
 }