#include<iostream>
#include<cstring>
#include<cstdio>
#include<vector>
#define rep(i, a, b) for (int i = a; i <= b; i++)
#define drep(i, a, b) for (int i = a; i >= b; i--)
#define ll long long
using namespace std;
const int N = 1e6 + 100;
vector<int> G[N];
int fa[N], val[N], point;
bool vis[N];
ll dp[N][2];
int n, d;
void add(int from, int to){
G[from].push_back(to);
fa[to] = from;
return ;
}
int find(int idx){
vis[idx] = true;
if (vis[fa[idx]]){
return fa[idx];
}
find(fa[idx]);
}
void dfs(int idx){
dp[idx][0] = 0;
dp[idx][1] = val[idx];
vis[idx] = true;
for (int p : G[idx]){
if (p == point){
continue;
}
dfs(p);
dp[idx][1] += dp[p][0];
dp[idx][0] += max(dp[p][0], dp[p][1]);
}
}
ll calc(int idx){
ll res = 0;
point = find(idx);
dfs(point);
res = max(res, dp[point][0]);
point = fa[point];
dfs(point);
res = max(res, dp[point][0]);
return res;
}
int main(){
cin >> n;
rep(i, 1, n){
cin >> val[i] >> d;
add(d, i);
}
ll ans = 0;
rep(i, 1, n){
if (!vis[i]){
ans += calc(i);
}
}
cout << ans;
return 0;
}