Cod sursa(job #1897386)

Utilizator MithrilBratu Andrei Mithril Data 1 martie 2017 13:05:00
Problema Cerere Scor 50
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.86 kb
#include <bits/stdc++.h>

using namespace std;
ifstream fin("cerere.in");
ofstream fout("cerere.out");
const int NMAX = 100001;
const int LOGMAX = 20;
int n,x,y;
int dp[LOGMAX][NMAX],memo[NMAX];
short k[NMAX];

int f(int i) {
    if(memo[i]!=-1) return memo[i];

    short lev=k[i];
    for(int p=0;(1<<p)<=lev;p++) {
        if((1<<p)&lev)
            i=dp[p][i];
    }
    return 1+f(i);
}

int main()
{
    fin>>n;
    for(int i=1;i<=n;i++) memo[i]=-1;
    for(int i=1;i<=n;i++) {
        fin>>k[i];
        if(k[i]==0) memo[i]=0;
    }
    for(int i=1;i<n;i++) {
        fin>>x>>y;
        dp[0][y]=x;
    }
    for(int i=1;(1<<i)<=n;i++) {
        for(int j=1;j<=n;j++) {
            dp[i][j]=dp[i-1][dp[i-1][j]];
        }
    }
    for(int i=1;i<=n;i++) memo[i]=f(i);
    for(int i=1;i<=n;i++) fout<<memo[i]<<' ';
    return 0;
}