Cod sursa(job #363334)

Utilizator DraStiKDragos Oprica DraStiK Data 12 noiembrie 2009 20:06:34
Problema Cerere Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.2 kb
#include <stdio.h>

#define DIM 100005
#define LOG 25

int a[LOG][DIM];
int p[DIM],rez[DIM],viz[DIM];
int n;

void read ()
{
    int i,x,y;

    scanf ("%d",&n);
    for (i=1; i<=n; ++i)
        scanf ("%d",&p[i]);
    for (i=1; i<n; ++i)
    {
        scanf ("%d%d",&x,&y);
        a[0][y]=x;
    }
}

void init ()
{
    int i,j,nr,ok;

    for (ok=i=1; ok; ++i)
    {
        for (ok=0, j=1; j<=n; ++j)
        {
            nr=a[i-1][j];
            if (nr)
            {
                ok=1;
                a[i][j]=a[i-1][nr];
            }
        }
    }
}

int stramos (int p,int q)
{
    int ct;

    for (ct=0; p && q; p>>=1, ++ct)
        if (p&1)
            q=a[ct][q];
    return q;
}

void solve (int start)
{
    int i,t;

    viz[start]=1;
    t=stramos (p[start],start);
    if (!viz[t])
        solve (t);
    rez[start]=rez[t]+1;
}

void print ()
{
    int i;

    for (i=1; i<=n; ++i)
    {
        if (!viz[i])
            solve (i);
        printf ("%d ",rez[i]-1);
    }
}

int main ()
{
    freopen ("cerere.in","r",stdin);
    freopen ("cerere.out","w",stdout);

    read ();
    init ();
    print ();

    return 0;
}