Cod sursa(job #1142024)

Utilizator teo.serbanescuTeo Serbanescu teo.serbanescu Data 13 martie 2014 13:16:12
Problema Cerere Scor 85
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.94 kb
#include <fstream>

using namespace std;

fstream f("cerere.in",ios::in);
fstream g("cerere.out",ios::out);

const long nmax=100005;

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

void read()
{
    f>>n;
    for (i=1;i<=n;i++) f>>s[i];
    for (i=1;i<n;i++)
    {
        f>>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]);
        }
        g<<nr<<" ";
    }
}


int main()
{
    read();
    ancestors();
    solve();
    f.close();g.close();
    return 0;
}