#include <iostream>
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#include <vector>
using namespace std;
#define N 10011
struct edge
{
int to;
int val;
};
int nodenum;
vector< edge > E[N];
int dis[N], maxn, end;
void init()
{
int v, w;
memset(dis, 0, sizeof(dis));
maxn = 0;
for( int i = 0; i <= nodenum; i++)
E[i].clear();
for( int i = 2; i <= nodenum; i++)
{
scanf("%d %d",&v, &w);
edge now ;
now.to = v;
now.val = w;
E[i].push_back(now);
now.to = i;
E[v].push_back(now);
}
}
void dfs( int u , int father, int tot)
{
if(tot > maxn)
{
maxn = tot;
end = u;
}
for( int i = 0; i < E[u].size(); i++)
{
int v = E[u][i].to;
int w = E[u][i].val;
if(v == father)
continue;
dis[v] = max(dis[v], tot + w);
dfs(v, u, tot + w);
}
}
int main()
{
while(scanf("%d",&nodenum) != EOF)
{
init();
dfs(1, -1, 0);
dfs(end, -1, 0);
dfs(end, -1 ,0);
for( int i = 1; i <= nodenum; i++)
printf("%d\n",dis[i]);
}
}
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#include <vector>
using namespace std;
#define N 10011
struct edge
{
int to;
int val;
};
int nodenum;
vector< edge > E[N];
int dis[N], maxn, end;
void init()
{
int v, w;
memset(dis, 0, sizeof(dis));
maxn = 0;
for( int i = 0; i <= nodenum; i++)
E[i].clear();
for( int i = 2; i <= nodenum; i++)
{
scanf("%d %d",&v, &w);
edge now ;
now.to = v;
now.val = w;
E[i].push_back(now);
now.to = i;
E[v].push_back(now);
}
}
void dfs( int u , int father, int tot)
{
if(tot > maxn)
{
maxn = tot;
end = u;
}
for( int i = 0; i < E[u].size(); i++)
{
int v = E[u][i].to;
int w = E[u][i].val;
if(v == father)
continue;
dis[v] = max(dis[v], tot + w);
dfs(v, u, tot + w);
}
}
int main()
{
while(scanf("%d",&nodenum) != EOF)
{
init();
dfs(1, -1, 0);
dfs(end, -1, 0);
dfs(end, -1 ,0);
for( int i = 1; i <= nodenum; i++)
printf("%d\n",dis[i]);
}
}