Cod sursa(job #1231802)

Utilizator touristGennady Korotkevich tourist Data 21 septembrie 2014 16:36:37
Problema Cerere Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.28 kb
#include <cstdio>
#include <vector>
#define Nmax 100005

using namespace std;

int str[Nmax],tata[Nmax],N,dp[Nmax][20],sol[Nmax];
vector <int> L[Nmax];

inline void RMQ()
{
    int i,j;
    for(i=1;i<=N;++i)
        for(j=1;j<20;++j)
            dp[i][j]=dp[dp[i][j-1]][j-1];
}

inline int Stramos(int i, int k)
{
    int p;
    for(p=19;p>=0;--p)
    {
        if((1<<p)>k) continue;
        if(dp[i][p])
        {
            i=dp[i][p];
            k-=(1<<p);
        }
    }
    return i;
}

inline void Dfs(int nod, int t)
{
    vector <int> ::iterator it;
    if(!str[nod])
        sol[nod]=1;
    else
        sol[nod]=1+sol[Stramos(nod,str[nod])];
    for(it=L[nod].begin();it!=L[nod].end();++it)
        if(*it!=t)
            Dfs(*it,nod);
}

int main()
{
    int y,x,i,rad;
    freopen ("cerere.in","r",stdin);
    freopen ("cerere.out","w",stdout);
    scanf("%d", &N);
    for(i=1;i<=N;++i)
        scanf("%d", &str[i]);
    for(i=1;i<N;++i)
    {
        scanf("%d%d", &x,&y);
        L[x].push_back(y); L[y].push_back(x);
        tata[y]=x; dp[y][0]=x;
    }
    for(i=1;i<=N;++i)
        if(!tata[i]) rad=i;
    RMQ();
    Dfs(rad,0);
    for(i=1;i<=N;++i)
        printf("%d ", sol[i]-1);
    printf("\n");
    return 0;
}