Cod sursa(job #2476169)

Utilizator ivan.tudorIvan Tudor ivan.tudor Data 18 octombrie 2019 11:19:11
Problema Cerere Scor 50
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.16 kb
#include <iostream>
#include<cstdio>
#include<vector>
using namespace std;
const int N=100005;
int str[18][N];
int k[N];
int log[N];
int tata[N];
vector<int> gr[N];
void prec(int n){
  log[1]=0;
  for(int i=2;i<=n+5;i++)
    log[i]=log[i/2]+1;
  for(int i=1;i<=n;i++)
    str[0][i]=tata[i];
  for(int len=0;len<17;len++){
    for(int i=1;i<=n;i++){
      str[len+1][i]=str[len][str[len][i]];
    }
  }
}
int dp[N];
int stramos(int nod,int k){
  while(k>0){
    int p=log[k];
    nod=str[p][nod];
    k-=(1<<p);
  }
  return nod;
}
void dfs(int nod,int tata){
  if(k[nod]==0)
    dp[nod]=0;
  else{
    int strm=stramos(nod,k[nod]);
    dp[nod]=1+dp[strm];
  }
  for(auto x:gr[nod]){
    if(x!=tata){
      dfs(x,nod);
    }
  }
}
int main()
{
  FILE*fin,*fout;
  fin=fopen("cerere.in","r");
  fout=fopen("cerere.out","w");
  int n;
  fscanf(fin,"%d",&n);
  for(int i=1;i<=n;i++){
    fscanf(fin,"%d",&k[i]);
  }
  for(int i=1;i<n;i++){
    int x,y;
    fscanf(fin,"%d%d",&x,&y);
    tata[y]=x;
    gr[x].push_back(y);
  }
  prec(n);
  for(int i=1;i<=n;i++){
    if(tata[i]==0){
      dfs(i,0);
      break;
    }
  }
  for(int i=1;i<=n;i++){
    fprintf(fout,"%d ",dp[i]);
  }
  return 0;
}