Cod sursa(job #1144636)

Utilizator teo.serbanescuTeo Serbanescu teo.serbanescu Data 17 martie 2014 13:28:29
Problema Cerere Scor 85
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.02 kb
#include <stdio.h>

using namespace std;

const long nmax=100005;

long n,xx,yy,x[nmax],s[nmax],a[18][nmax],i,j,nr;

FILE *f,*g;


void read()
{
    fscanf(f,"%d",&n);
    for (i=1;i<=n;i++) fscanf(f,"%d",&s[i]);
    for (i=1;i<n;i++)
    {
        fscanf(f,"%d%d",&xx,&yy);
        x[yy]=xx;
    }
}

void ancestors()
{
    for (j=1;j<=n;j++) a[0][j]=x[j];
    for (i=1;i<=17;i++)
        for (j=1;j<=n;j++)
            a[i][j]=a[i-1][a[i-1][j]];
}

long lookforancestor(int nod,int p)
{
    int k;
    for (k=17;k>=0;k--)
        if (p&(1<<k)) nod=a[k][nod];
    return nod;
}

void solve()
{
    int q;
    for (i=1;i<=n;i++)
    {
        q=i;
        nr=0;
        while (s[q]!=0)
        {
            nr++;
            q=lookforancestor(q,s[q]);
        }
        fprintf(g,"%d",nr);
        fprintf(g," ");
    }
}


int main()
{
    f=fopen("cerere.in","r");
    g=fopen("cerere.out","w");
    read();
    ancestors();
    solve();
    fclose(f);fclose(g);
    return 0;
}