#include <bits/stdc++.h>
using namespace std;
const int INF = (int)2e9;
const long long INFL = (long long)9e18;
const int MAXINT = ((~0) ^ (1 << 31));
const long long MAXLL = ((~0) ^ ((long long)1 << 63));
template <class T>
inline T pow2(T a) {
  return a * a;
}
template <class T>
inline bool mineq(T& a, T b) {
  return (a > b) ? (a = b, true) : false;
}
template <class T>
inline bool maxeq(T& a, T b) {
  return (a < b) ? (a = b, true) : false;
}
const int maxn = (int)2e5 + 10;
;
long long zoj[maxn], fard[maxn], pr[maxn], n, val[maxn];
vector<int> adj[maxn];
void dfs(int v) {
  long long sum = 0, mn = INF, z = 0, mchild = INF;
  for (int i = 0; i < (int)(adj[v].size()); i++) {
    int u = adj[v][i];
    if (u != pr[v])
      dfs(u);
    else
      continue;
    long long a = zoj[u], b = fard[u];
    if (a > b) {
      sum += a;
    } else {
      sum += b;
      mineq(mchild, b);
      z ^= 1;
    }
    mineq(mn, abs(b - a));
  }
  if (z) {
    zoj[v] = sum - mn;
    fard[v] = max(sum, sum + val[v] - mn);
  } else {
    zoj[v] = sum;
    fard[v] = sum + val[v];
  }
}
int main() {
  ios_base::sync_with_stdio(0);
  cin.tie(0);
  cin >> n;
  for (int i = 1; i < (int)(n + 1); i++) {
    cin >> pr[i] >> val[i];
    if (pr[i] != -1) {
      adj[i].push_back(pr[i]);
      adj[pr[i]].push_back(i);
    }
  }
  dfs(1);
  cout << fard[1];
}
