#include<cstdio>
#include<algorithm>
#include<vector>
#define maxn 131080
#define LL long long
#define x first
#define y second
using namespace std;
typedef pair<LL,LL> PLL;
int n,fa[maxn];
LL mv[maxn];
vector<PLL> f[maxn];
struct node { int v,w; node *nxt; } edge[maxn],*head[maxn],*ncnt;
void addedge(int u,int v,int w)
{
	ncnt++;
	ncnt->v=v,ncnt->w=w,ncnt->nxt=head[u];
	head[u]=ncnt;
}
bool cmpx(PLL a,PLL b){return a.first<b.first;}
bool cmpy(PLL a,PLL b){return a.second<b.second;}
void work(vector<PLL> &ls,vector<PLL> &rs,vector<PLL> &f,LL mid)
{
    if(ls.size()>rs.size()) swap(ls,rs);
    int el=ls.size(),er=rs.size();
    sort(ls.begin(),ls.end(),cmpy);
    sort(rs.begin(),rs.end(),cmpx);
    mv[0]=rs[0].second;
    for(int i=1;i<er;i++) mv[i]=min(mv[i-1],rs[i].second);
    for(int i=0,j=er-1;i<el;i++)
    {
        while(j>=0&&ls[i].second+rs[j].first>mid) j--;
        if(j>=0) f.push_back(PLL(ls[i].first,mv[j]));
    }
    sort(ls.begin(),ls.end(),cmpx);
    sort(rs.begin(),rs.end(),cmpy);
    mv[0]=rs[0].first;
    for(int i=1;i<er;i++) mv[i]=min(mv[i-1],rs[i].first);
    for(int i=0,j=er-1;i<el;i++)
    {
        while(j>=0&&ls[i].first+rs[j].second>mid) j--;
        if(j>=0) f.push_back(PLL(mv[j],ls[i].second));
    }
}
void dfs(int u,LL mid)
{
	f[u].clear();
	if(!head[u]) { f[u].push_back(PLL(0,0)); return; }
	int lc=head[u]->v,rc=head[u]->nxt->v;
	int lw=head[u]->w,rw=head[u]->nxt->w;
	dfs(lc,mid); dfs(rc,mid);
	vector<PLL> &ls=f[lc];
	for(int i=0,siz=ls.size(),c=lw;i<siz;i++)
		ls[i].first+=c,ls[i].second+=c;
	vector<PLL> &rs=f[rc];
	for(int i=0,siz=rs.size(),c=rw;i<siz;i++)
		rs[i].first+=c,rs[i].second+=c;
	work(ls,rs,f[u],mid);
	ls.clear(); rs.clear();
}
LL BS()
{
	LL l=-1,r=(LL)1e10;
	while(l+1<r)
	{
		int mid=(l+r)/2; dfs(1,mid);
		if(f[1].empty()) l=mid;
		else r=mid;
	}
	return r;
}
int main()
{
	ncnt=&edge[0];
	scanf("%d",&n);
	for(int i=2;i<=n;i++)
	{
		int w;
		scanf("%d%d",&fa[i],&w);
		addedge(fa[i],i,w);
	}
	printf("%lld\n",BS());
}
