Cod sursa(job #353447)

Utilizator mottyMatei-Dan Epure motty Data 5 octombrie 2009 10:48:35
Problema Cerere Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.9 kb
#include<cstdio>
#include<vector>

using namespace std;

const int N=1<<17;

vector <int> f[N];

int n,q[N],v[N],t[N],k=0;

bool felix_radacinosu[N];

void read()
{
    int x,y;
    scanf("%d",&n);
    for( int i=1 ; i<=n ; ++i )
        scanf("%d",&q[i]);
    for( int i=1 ; i<n ; ++i )
    {
        scanf("%d%d",&x,&y);
        felix_radacinosu[y]=1;
        f[x].push_back(y);
    }
}

void dfs(int x)
{
    v[++k]=x;
    if(q[x])
        t[x]=t[v[k-q[x]]]+1;
    for( int i=0 ; i<f[x].size() ; ++i )
        dfs(f[x][i]);
    --k;
}

void print()
{
    for( int i=1 ; i<=n ; ++i )
        printf("%d ",t[i]);
}

int radacina()
{
    int i;
    for( i=1 ; i<=n && felix_radacinosu[i]==1 ; ++i );
    return i;
}

int main()
{
    freopen("cerere.in","r",stdin);
    freopen("cerere.out","w",stdout);
    read();
    dfs(radacina());
    print();
    return 0;
}