//Accepted 740 KB 15 ms
//树的直径
//距离一个顶点最远的点一定是树的直径的一个端点
#include <cstdio>
#include <cstring>
#include <queue>
#include <iostream>
using namespace std;
;
int dis[imax_n];
int d1[imax_n];
int d2[imax_n];
int head[imax_n];
*imax_n];
int e;
struct node
{
int u,v,c;
node()
{
}
node(int u,int v,int c)
{
this->u=u;
this->v=v;
this->c=c;
}
}p[*imax_n];
int n;
void addEdge(int u,int v,int c)
{
p[e]=node(u,v,c);
next[e]=head[u];
head[u]=e++;
}
void init()
{
memset(head,-,sizeof(head));
memset(next,-,sizeof(next));
e=;
}
void read()
{
init();
int x,y;
;i<=n;i++)
{
scanf("%d%d",&x,&y);
addEdge(i,x,y);
addEdge(x,i,y);
}
}
int max(int a,int b)
{
return a>b?a:b;
}
queue<int >q;
bool vis[imax_n];
int bfs(int s)
{
//printf("111111\n");
memset(dis,,sizeof(dis));
;
int temp_node;
while (!q.empty()) q.pop();
memset(vis,,])*(n+));
q.push(s);
vis[s]=;
while (!q.empty())
{
int x=q.front();
if (dis[x]>ans)
{
ans=dis[x];
temp_node=x;
}
q.pop();
;i=next[i])
{
int y=p[i].v;
if (!vis[y])
{
vis[y]=;
q.push(y);
if (dis[x]+p[i].c>dis[y])
dis[y]=dis[x]+p[i].c;
}
}
}
return temp_node;
}
int main()
{
while (scanf("%d",&n)!=EOF)
{
read();
);
x=bfs(x);
memcpy(d1,dis,sizeof(dis));
bfs(x);
memcpy(d2,dis,sizeof(dis));
;i<=n;i++)
{
printf("%d\n",max(d1[i],d2[i]));
}
}
;
}