Cod sursa(job #1887527)

Utilizator DenisONIcBanu Denis Andrei DenisONIc Data 21 februarie 2017 17:26:39
Problema Cerere Scor 50
Compilator cpp Status done
Runda becreative21 Marime 0.97 kb
#include <fstream>
#include <cstdio>
#include <cmath>
#define Nmax 100001
using namespace std;

ofstream g("cerere.out");

int n,K[Nmax],DP[17][Nmax],rez[Nmax];

int stramos(int nod,int k)
{
    if (k==0)
        return nod;
    int x = log2(k);
    return stramos(DP[x][nod],k-(1<<x));
}

int check(int nod,int k)
{
    int s = stramos(nod,k);
    if (rez[s]==0 && K[s]!=0)
        rez[s] = check(s,K[s]);
    return rez[s]+1;
}

int main()
{
    freopen("cerere.in","r",stdin);
    scanf("%d",&n);
    for (int i=1;i<=n;i++)
        scanf("%d",&K[i]);
    for (int i=1;i<n;i++)
    {
        int x,y;
        scanf("%d%d",&x,&y);
        DP[0][y] = x;
    }

    int mx = log2(n);

    for (int i=1;i<=mx;i++)
        for (int j=1;j<=Nmax;j++)
            DP[i][j] = DP[i-1][DP[i-1][j]];

    for (int i=1;i<=n;i++)
    {
        if (rez[i]==0 && K[i]!=0)
            rez[i] = check(i,K[i]);
        g<<rez[i]<<' ';
    }

    return 0;
}