Pagini recente » Cod sursa (job #3252290) | Cod sursa (job #1892756) | Cod sursa (job #1188186) | Cod sursa (job #2738162) | Cod sursa (job #352778)
Cod sursa(job #352778)
#include <stdio.h>
#include <vector>
#define N 1<<17
#define P 1<<20
#define Q 1<<5
using namespace std;
int n,nr[N],sol[N],parinte[N],poz;
vector <int> v[N];
char viz[N],line[P],line2[Q];
inline int cif(char x)
{
return x>='0' && x<='9';
}
void read()
{
scanf("%d\n",&n);
int i,j,x,y;
fgets(line+1,P,stdin);
poz=1;
for (i=1; i<=n; i++)
{
while (line[poz]==' ')
poz++;
while(cif(line[poz]))
nr[i]=nr[i]*10+line[poz]-'0',poz++;
}
for (i=1; i<n; i++)
{
fgets(line2+1,Q,stdin);
poz=1;x=0;y=0;
for (j=1; j<=2; j++)
{
while (line2[poz]==' ')
poz++;
while(cif(line2[poz]))
if (j==1)
x=x*10+line2[poz]-'0',poz++;
else
y=y*10+line2[poz]-'0',poz++;
}
v[x].push_back(y);
parinte[y]=x;
}
}
void solve(int nod)
{
viz[nod]=1;
int i,t=nod;
for (i=1; i<=nr[nod]; i++)
t=parinte[t];
if (!viz[t])
{
solve(t);
sol[nod]=sol[t]+1;
}
else
sol[nod]=sol[t]+1;
}
int main()
{
freopen("cerere.in","r",stdin);
freopen("cerere.out","w",stdout);
read();
for (int i=1; i<=n; i++)
{
if (!viz[i])
solve(i);
printf("%d ",sol[i]-1);
}
return 0;
}