#include <bits/stdc++.h>
using namespace std;
vector<int> v[200002];
long long int a[200002];
int n;
long long int dp[2][200002];
inline void dfs(int b) {
  if (v[b].size() == 0) {
    dp[1][b] = a[b];
    return;
  }
  int ind = 0;
  long long int mint = LLONG_MAX;
  vector<int> ev;
  vector<int> od;
  ev.clear();
  od.clear();
  for (int i = 0; i < v[b].size(); i++) {
    dfs(v[b][i]);
  }
  int same = 0;
  long long int sum = 0;
  for (int i = 0; i < v[b].size(); i++) {
    int &go = v[b][i];
    if (dp[0][go] == dp[1][go]) {
      same++;
    }
    if (dp[0][go] > dp[1][go]) {
      ev.push_back(go);
    }
    if (dp[0][go] < dp[1][go]) {
      od.push_back(go);
    }
    sum += max(dp[0][go], dp[1][go]);
  }
  int g = 2 * ev.size() + od.size();
  g %= 2;
  dp[g][b] = max(dp[g][b], sum);
  if (g == 0) {
    dp[1][b] = max(dp[1][b], sum + a[b]);
  }
  if (same) {
    g ^= 1;
    dp[g][b] = max(dp[g][b], sum);
    if (g == 0) {
      dp[1][b] = max(dp[1][b], sum + a[b]);
    }
    return;
  }
  g ^= 1;
  long long int maxt = 0;
  for (int i = 0; i < ev.size(); i++) {
    maxt = max(maxt, sum - dp[0][ev[i]] + dp[1][ev[i]]);
  }
  for (int i = 0; i < od.size(); i++) {
    maxt = max(maxt, sum - dp[1][od[i]] + dp[0][od[i]]);
  }
  sum = maxt;
  dp[g][b] = max(dp[g][b], sum);
  if (g == 0) {
    dp[1][b] = max(dp[1][b], sum + a[b]);
  }
  return;
}
int main() {
  scanf("%d", &n);
  for (int i = 0; i < n; i++) {
    int b;
    scanf("%d", &b);
    scanf("%lld", &a[i]);
    if (i) {
      b--;
      v[b].push_back(i);
    }
  }
  dfs(0);
  long long int ans = max(dp[0][0], dp[1][0]);
  printf("%lld\n", ans);
  return 0;
}
