Cod sursa(job #2142090)

Utilizator AlexandruLuchianov1Alex Luchianov AlexandruLuchianov1 Data 24 februarie 2018 18:44:02
Problema Cerere Scor 85
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.17 kb
#include <iostream>
#include <fstream>

using namespace std;
ifstream in ("cerere.in");
ofstream out ("cerere.out");
int const nmax = 100000;
int const lgmax = 16;

int far[5 + lgmax][5 + nmax];
int query[5 + nmax];
int dp[5 + nmax];
int n;

void computefar(){
  for(int h = 1 ; h <= lgmax ;h++){
    for(int i = 1 ; i <= n ;i++){
      int result = far[h - 1][i];
      far[h][i] = far[h - 1][result];
    }
  }
}

int computedp(int node){
  int dist = query[node];
  if(0 <= dp[node])
    return dp[node];
  if(query[node] == 0)
    dp[node] = 0;
  else{
    int result = node;
    for(int h = lgmax ; 0 <= h ; h--){
      int jump = (1 << h);
      if(jump <= dist){
        dist -= jump;
        result = far[h][result];
      }
    }
    computedp(result);
    dp[node] = dp[result] + 1;
  }
  return dp[node];
}

int main()
{
  in>>n;
  for(int i = 1 ; i <= n ;i++){
    in>>query[i];
    dp[i] = -1;
  }
  for(int i = 1 ; i < n ;i++){
    int a , b;
    in>>a>>b;
    far[0][b] = a;
  }
  computefar();
  for(int i = 1 ; i <= n ;i++){
    if(dp[i] == -1){
      computedp(i);
    }
    out<<dp[i]<<" ";
  }
  return 0;
}