#include <bits/stdc++.h>
using namespace std;
const int N=1e4+;
struct T {
int to;
int w;
};
vector < vector <T> > g (N);
int d[N][];// d[i][0] 正向最大距离 d[i][1] 正向次大距离 d[i][2] 反向最大距离
int p[N]; // 正向最大距离所经过的子节点
int n;
void dfs1(int root) {//求正向距离
p[root]=d[root][]=d[root][]=d[root][]=;
for (int i=;i<g[root].size();i++) {
int _next=g[root][i].to;
int cost=g[root][i].w;
dfs1(_next);
if (d[root][]<d[_next][]+cost) {
d[root][]=d[root][];
d[root][]=d[_next][]+cost;
p[root]=_next;
}
else if (d[root][]<d[_next][]+cost)
d[root][]=d[_next][]+cost;
}
return ;
}
void dfs2(int root) {//求逆向距离
for (int i=;i<g[root].size();i++) {
int _next=g[root][i].to;
int cost=g[root][i].w;
if (_next!=p[root]) d[_next][]=max (d[root][],d[root][])+cost;
else d[_next][]=max (d[root][],d[root][])+cost;
dfs2(_next);
}
return ;
}
int main ()
{
while (~scanf ("%d",&n)) {
for (int i=;i<=n;i++) g[i].clear();
for (int i=;i<=n;i++) {
int x,cost; scanf ("%d %d",&x,&cost);
T tmp={i,cost}; g[x].push_back(tmp);
}
int root=;
dfs1(root);
dfs2(root);
for (int i=;i<=n;i++)
printf ("%d\n",max (d[i][],d[i][]));
}
return ;
}