Cod sursa(job #781789)

Utilizator ionut_blesneagIonut Blesneag ionut_blesneag Data 25 august 2012 00:51:24
Problema Cerere Scor 85
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.43 kb
#include<fstream>
using namespace std;

int n,i,j,k,a,b,q[100001],lg[100001],incrm,imax;
int m[20][100001],ans[100001],nrc,nr;
char buff1[20];
char buff2[700000];
int viz[100001];

int extrage(int x, int ancestor)
{int lga;
while(ancestor)
{lga=lg[ancestor];
x=m[lga][x];
ancestor=ancestor-(1<<lga);}
return x;
}

void lucreaza(int x)
{int ancestor;
if(q[x]==0)
  ans[x]=0;
else{  
viz[x]=1;
ancestor=q[x];
if(q[extrage(x,ancestor)]!=0)
   lucreaza(extrage(x,ancestor));
nr++;
ans[x]=nr;   }  
}


int get_number1()
{int nrn=0;
while(buff1[nrc]<='9' && buff1[nrc]>='0')
 {nrn=10*nrn+buff1[nrc]-'0';
  nrc++;}
return nrn;
}

int get_number2()
{int nrn=0;
while(buff2[nrc]<='9' && buff2[nrc]>='0')
 {nrn=10*nrn+buff2[nrc]-'0';
  nrc++;}
return nrn;
}

int main()
{freopen("cerere.in","r",stdin);
freopen("cerere.out","w",stdout);
gets(buff1);  nrc=0;
n=get_number1();
gets(buff2);  nrc=0;
for(i=1; i<=n; i++)
  {q[i]=get_number2();  nrc++;}  
for(i=1; i<=n-1; i++)
  {gets(buff1);  nrc=0;
   a=get_number1();  nrc++;
   b=get_number1();  nrc++;
   m[0][b]=a;} 
incrm=1;
i=0;
while(incrm)
 {i++;
  incrm=0;
  for(j=1; j<=n; j++) 
    {m[i][j]=m[i-1][m[i-1][j]];
     if(m[i][j]!=0)
       incrm=1;}
  }        
imax=i-1;    

for(i=2; i<=n; i++)
 lg[i]=lg[i/2]+1;

for(k=1; k<=n; k++) 
if(viz[k]==0)
{nr=0;
lucreaza(k);}

for(k=1; k<=n; k++)
 printf("%d ",ans[k]);      

return 0;}