Cod sursa(job #477452)

Utilizator doru.nituNitu Doru Constantin doru.nitu Data 14 august 2010 18:17:53
Problema Cerere Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.85 kb
#include<cstdio>
#include<vector>
#include<bitset>

using namespace std;

int n,i,rez[100009],k[100009],stiva[100009],nr;
vector<int> a[100009];
bitset<100009> fol;
bitset<100009>grad;

void dfs(int i)
{
    fol[i]=1;
    stiva[++nr]=i;
    if(k[i]) rez[i]= rez[ stiva[nr-k[i]] ]+1;
    for(int j=0;j<a[i].size();++j)
    if(!fol[a[i][j]]) dfs(a[i][j]);
    --nr;
}

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

    scanf("%d",&n);
    for(i=1;i<=n;++i)
        scanf("%d",&k[i]);
    for(i=1;i<n;++i)
    {
        int x,y;
        scanf("%d%d",&x,&y);
        a[x].push_back(y);
        grad[y]=1;
    }

    for(i=1;i<=n;++i)
    if(!fol[i]&&!grad[i]) dfs(i);

    for(i=1;i<=n;++i) printf("%d ",rez[i]);
    printf("\n");

    fclose(stdin);
    fclose(stdout);

    return 0;
}