//              +-- -- --++-- +-In the name of ALLAH-+ --++-- -- --+              \\

#include <bits/stdc++.h>

#define int ll

#define F first
#define S second
#define _sz(x) (int)x.size()

using namespace std ;
using ll = long long ;
using ld = long double ;
using pii = pair <int , int> ;

int const N = 2e5 + 20 , inf = 2e18 + 20 ;
int n , par[N] , w[N] ;
vector <int> g[N] ;
set <pii> st[N] ;

int W ;

void dfs (int v) {
	if (!_sz(g[v])) {
		st[v].insert({0 , 0}) ;
		return ;
	}
	
	int x = g[v][0] , y = g[v][1] ;

	dfs(x) , dfs(y) ;

	for (pii p : st[x]) {
		set <pii> :: iterator it = st[y].lower_bound({W - p.S - w[x] - w[y] + 1 , -1}) ;

		if (it != st[y].begin()) {
			it -- ;
			pii q = *it ;
			
			st[v].insert({p.F + w[x] , q.S + w[y]}) ;
			st[v].insert({q.S + w[y] , p.F + w[x]}) ;
		}
	}

	int mn = inf ;
	for (set <pii> :: iterator it = st[v].begin() ; it != st[v].end() ;) {
		pii p = *it ;

		if (mn <= p.S) st[v].erase(p) ;
		mn = min(mn , p.S) ;

		it = st[v].upper_bound(p) ;
	}
}

int32_t main(){
	ios::sync_with_stdio(false) , cin.tie(0) , cout.tie(0) ;

	cin >> n ;
	for (int i = 1 ; i < n ; i ++) {
		cin >> par[i] >> w[i] ;
		par[i] -- ;
		g[par[i]].push_back(i) ;
	}

	int low = -1 , high = 1e11 ;
	while (high - low > 1) {
		W = (low + high) / 2 ;

		for (int i = 0 ; i < n ; i ++) st[i].clear() ;

		dfs(0) ;

		if (st[0].empty()) low = W ;
		else high = W ;
	}

	cout << high << '\n' ;
}
