Cod sursa(job #1393096)

Utilizator pepsiM4A1Ozturk Arif pepsiM4A1 Data 19 martie 2015 08:31:40
Problema Cerere Scor 5
Compilator cpp Status done
Runda Teme Pregatire ACM Unibuc 2013 Marime 1.5 kb
#include <stdio.h>
#define DIM 10000
char buff[DIM];
int poz=0;
void citeste(int &numar)
{
     numar = 0;
     while (buff[poz] < '0' || buff[poz] > '9')     
          if (++poz == DIM) 
               fread(buff,1,DIM,stdin),poz=0;
     while ('0'<=buff[poz] && buff[poz]<='9')
     {
          numar = numar*10 + buff[poz] - '0';
          if (++poz == DIM) 
               fread(buff,1,DIM,stdin),poz=0;               
     }     
}
int tata[100001];
int x[100001];
int dest[100001];
int sol[100001];
int n;
int solve(int nod)
{
     if(sol[nod]!=-1) return nod;
     sol[nod]=sol[solve(dest[nod])]+1;
}
int main()
{
    freopen ("cerere.in","r",stdin);
    freopen ("cerere.out","w",stdout);
    citeste(n);
    for(int i=1;i<=n;i++) citeste(x[i]);
    int p1,p2;
    for(int i=1;i<n;i++)
    {
            citeste(p1);
            citeste(p2);
            tata[p2]=p1;
    }
    for(int i=1;i<=n;i++)
    {
            sol[i]=-1;
            if(x[i]==0) 
            {
                        dest[i]=0;
                        sol[i]=0;
            }
            else
            {
                dest[i]=i;
                for(int j=1;j<=x[i];j++)
                {
                        dest[i]=tata[dest[i]];
                }
            }
        //    printf("%d %d\n",dest[i],sol[i]);
    }
    for(int i=1;i<=n;i++)
    {
            if(sol[i]==-1)
            {
                         solve(i); 
            }
            printf("%d ",sol[i]);
    }
}