Cod sursa(job #1897345)

Utilizator MithrilBratu Andrei Mithril Data 1 martie 2017 12:43:39
Problema Cerere Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.09 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,mRoot;
int dp[LOGMAX][NMAX],memo[NMAX];
short k[NMAX];
vector<int> G[NMAX];
bitset<NMAX> notRoot;

short 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);
}

void DFS(int i) {
    memo[i] = f(i);
    for(auto q:G[i]) {
        DFS(q);
    }
}

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;
        notRoot[y]=1;
        G[x].push_back(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++) {
        if(!notRoot[i])
            DFS(i);
    }
    for(int i=1;i<=n;i++) fout<<memo[i]<<' ';
    return 0;
}