#include<stdio.h>
#include<iostream>
#include<algorithm>
#include<stdlib.h>
#include<string.h>
#include<queue>
#define LL long long
using namespace std;
inline int read( )
{
  int sum=0;char c=getchar( );bool f=0;
  while(c<'0'||c>'9') {if(c=='-') f=1;c=getchar( );}
  while(c>='0'&&c<='9') {sum=sum*10+c-'0';c=getchar( );}
  if(f) return -sum;
  return sum;
}
const int N=200005;
const LL INF=1e18;
struct ex{LL x,y;ex(){}ex(LL _,LL __){x=_;y=__;}}G[N*40];
inline bool operator < (const ex &a,const ex &b) {return a.x<b.x;}
int n,a[N];LL dep[N],LIM;
struct e{int num,next,w;}map[N];
int head[N],len;
inline void link(int x,int y,int w) {map[++len]=(e){y,head[x],w};head[x]=len;}
int LS[N],RS[N],sz[N],rl[N];
vector<ex>S[N];
inline void dfs(int k)
{
  int i,x;
  for(i=head[k];i;i=map[i].next)
    {
      x=map[i].num;
      dep[x]=dep[k]+map[i].w;dfs(x);
      LS[k]?RS[k]=x:LS[k]=x;
    }
  if(LS[k]) sz[k]=sz[LS[k]]+sz[RS[k]],S[k].resize(min(sz[LS[k]],sz[RS[k]])<<1);
  else sz[k]=1,S[k].resize(1);
}
inline bool DFS(int k)
{
  if(!LS[k]) {rl[k]=0;S[k][0]=ex(dep[k],dep[k]);return 1;}
  int L=LS[k],R=RS[k];
  if(!DFS(L)||!DFS(R)) return 0;
  if(rl[L]>rl[R]) swap(L,R);
  int i,j,inc=-1;LL P=dep[k]<<1;
  for(i=0,j=rl[R];i<=rl[L]&&j>=0;i++)
    {
      while(j>=0&&S[L][i].x+S[R][j].x-P>LIM) j--;
      if(!i&&j<0) return 0;
      if(j>=0)
	{
	  G[++inc]=ex(S[L][i].y,S[R][j].y);
	  G[++inc]=ex(S[R][j].y,S[L][i].y);
	}
    }
  sort(G,G+inc+1);P=INF;
  for(i=0,j=-1;i<=inc;i++)
    if(G[i].y<P) S[k][++j]=G[i],P=G[i].y;
  rl[k]=j;return 1;
}
int main( )
{
  int i,x,w;LL T=0;
  n=read( );
  for(i=2;i<=n;i++) 
    {
      x=read( ),w=read( );
      link(x,i,w);T+=w;
    }
  dfs(1);
  LL l=0,r=T;
  while(l<=r)
    {
      LIM=(l+r)>>1;
      if(DFS(1)) r=LIM-1;
      else l=LIM+1;
    }
  printf("%lld",l);
  return 0;
}
