Pagini recente » Cod sursa (job #2740002) | Cod sursa (job #2229061) | Cod sursa (job #621392) | Cod sursa (job #2612953) | Cod sursa (job #781761)
Cod sursa(job #781761)
#include<fstream>
using namespace std;
int n,i,j,k,a,b,q[100001],lg[100001],incrm,imax,ancestor;
int m[20][100001],ans[100001],nrc;
char buff1[20];
char buff2[700000];
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(i=0; i<=imax; i++)
{for(j=1; j<=n; j++)
g<<m[i][j]<<" ";
g<<endl;} */
for(k=1; k<=n; k++)
{j=k; // ancestor=q[k];
while(q[j]!=0)
{ancestor=q[j];
ans[k]++;
while(ancestor)
{i=lg[ancestor];
j=m[i][j];
ancestor=ancestor-(1<<i);}
}
}
for(k=1; k<=n; k++)
printf("%d ",ans[k]);
return 0;}