Cod sursa(job #588716)

Utilizator mihai995mihai995 mihai995 Data 9 mai 2011 10:39:21
Problema Cerere Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.26 kb
#include <fstream>
#include <vector>
using namespace std;

const int N=100002,LG=18,inf=1<<30;
int a[N][LG],v[N],L[N],rez[N],n;
vector<int> fii[N];

ifstream in("cerere.in");
ofstream out("cerere.out");

int stramos(int x,int y)
{
    if (y==(1<<L[y]))
        return a[x][L[y]];
    return stramos(a[x][L[y]],y-(1<<L[y]));
}

void dfs(int x)
{
    if (!v[x])
        rez[x]=0;
    else
        rez[x]=rez[v[x]]+1;
    for (vector<int>:: iterator i=fii[x].begin();i!=fii[x].end();i++)
        dfs(*i);
}

void print(int v[])
{
    for (int i=1;i<=n;i++)
        out<<v[i]<<" ";
    out<<"\n";
}

int main()
{
    int i,j,x,y;
    in>>n;
    L[0]=-1;
    for (i=0;i<LG-1;i++)
        L[1<<i]=i;
    for (i=1;i<=n;i++)
    {
        in>>v[i];
        if (!L[i])
            L[i]=L[i-1];
    }
    L[1]=0;
    for (i=1;i<n;i++)
    {
        in>>x>>y;
        a[y][0]=x;
        fii[x].push_back(y);
    }
    /*
    for (j=1;j<LG;j++)
        for (i=1;i<=n;i++)
            a[i][j]=a[a[i][j-1]][j-1];
    */
    for (i=1;i<=n;i++)
        if (v[i])
            v[i]=stramos(i,v[i]);
    for (i=1;i<=n;i++)
        if (!a[i][0])
        {
            dfs(i);
            rez[i]=0;
        }
    print(rez);
    return 0;
}