Cod sursa(job #1170221)

Utilizator hevelebalazshevele balazs hevelebalazs Data 12 aprilie 2014 22:27:05
Problema Cerere Scor 5
Compilator c Status done
Runda Arhiva de probleme Marime 0.92 kb
#include <stdio.h>
#define fr(i,a,b) for(i=a;i<b;++i)
#define N 100000
#define L 17
char T[N];
int p[N],t[N],TN,P[N][L],k[N],X[N];
int LA[L];
void top(int i){
    if(T[i])return;
    T[i]=1;
    if(i)top(p[i]);
    t[TN++]=i;
    }
int get(int i,int K,int l){
    if(!i)return 0;
    if(!K)return i;
    if(K&LA[l]) return get(P[i][l],K-(LA[l]),l-1);
    return get(i,K,l-1);
    }
int main(){
    freopen("cerere.in","r",stdin);
    freopen("cerere.out","w",stdout);
    int n,i,I,j,x,y;
    scanf("%i",&n);
    LA[0]=1;
    fr(i,1,L)LA[i]=LA[i-1]<<1;
    fr(i,0,n)scanf("%i",k+i);
    fr(i,1,n)scanf("%i%i",&x,&y),p[y-1]=x-1;
    fr(i,0,n)top(i);
    fr(i,1,n){
        I=t[i];
        fr(j,0,L) x=P[I][j]=j?P[x][j-1]:p[I];
        }
    fr(i,0,n){
        I=t[i];
        if(!k[I]){X[I]=0;continue;}
        X[I]=1+X[get(I,k[I],L)];
        }
    fr(i,0,n)printf("%i ",X[i]);
    return 0;
    }