#include <iostream>
#include <cstdio>

using namespace std;

typedef long long LL;

int read()
{
	int x=0,f=1;
	char ch=getchar();
	while (!isdigit(ch)) f=ch=='-'?-1:f,ch=getchar();
	while (isdigit(ch)) x=x*10+ch-'0',ch=getchar();
	return x*f;
}

const int N=131072;
const int S=2000050;

struct data
{
	LL dis,len;

	data (LL dis_=0,LL len_=0){dis=dis_,len=len_;}
}f[S],tmp[N][2];

int st[N],fa[N],a[N],cnt[N];
int son[N][2];
LL lim;
int n,idx;

void dp(int x,LL upp)
{
	if (!son[x][0])
	{
		f[st[x]=++idx]=data(0,0),cnt[x]=1;
		return;
	}
	dp(son[x][0],upp),dp(son[x][1],upp);
	if (!cnt[son[x][0]]||!cnt[son[x][1]]) return;
	st[x]=idx+1;
	int tot[2]={0,0},u=son[x][0],v=son[x][1];
	for (int i=1;i<=cnt[u];++i) f[st[u]+i-1].dis+=a[u],f[st[u]+i-1].len+=a[u];
	for (int i=1;i<=cnt[v];++i) f[st[v]+i-1].dis+=a[v],f[st[v]+i-1].len+=a[v];
	for (int cur=cnt[v],i=cnt[u];i>=1;--i)
	{
		for (;cur&&f[st[v]+cur-1].dis+f[st[u]+i-1].len>upp;--cur);
		if (cur) tmp[++tot[0]][0]=data(f[st[u]+i-1].dis,f[st[v]+cur-1].len);
	}
	for (int cur=cnt[u],i=cnt[v];i>=1;--i)
	{
		for (;cur&&f[st[u]+cur-1].dis+f[st[v]+i-1].len>upp;--cur);
		if (cur) tmp[++tot[1]][1]=data(f[st[v]+i-1].dis,f[st[u]+cur-1].len);
	}
	int ptr[2]={tot[0],tot[1]};
	for (;ptr[0]||ptr[1];)
	{
		data ret;
		if (!ptr[0]||(ptr[1]&&tmp[ptr[0]][0].dis>tmp[ptr[1]][1].dis||tmp[ptr[0]][0].dis==tmp[ptr[1]][1].dis&&tmp[ptr[0]][0].len>tmp[ptr[1]][1].len)) ret=tmp[ptr[1]--][1];
		else ret=tmp[ptr[0]--][0];
		if (!cnt[x]||f[st[x]+cnt[x]-1].len>ret.len) f[st[x]+(cnt[x]++)]=ret;
	}
	idx+=cnt[x];
}

bool judge(LL upp)
{
	idx=0;
	for (int i=1;i<=n;++i) st[i]=cnt[i]=0;
	dp(1,upp);
	return cnt[1];
}

LL binary_search()
{
	LL l=0,r=lim,ret=-1;
	for (LL mid;l<=r;)
	{
		mid=l+r>>1;
		if (judge(mid)) r=(ret=mid)-1;
		else l=mid+1;
	}
	return ret;
}

int main()
{
	n=read();
	for (int i=2;i<=n;++i)
	{
		fa[i]=read(),lim+=a[i]=read();
		if (son[fa[i]][0]) son[fa[i]][1]=i;
		else son[fa[i]][0]=i;
	}
	printf("%lld\n",binary_search());
	return 0;
}