//求大佬指点 不知道对不对
#include<iostream>
#include<vector>
using namespace std;
int GetMaxScore(vector<int> &vec,vector<int> value);
int main()
{
int N;
while (cin >> N)
{
int Ai, Bi;
vector<int> value;
vector<int> path(N,-1);
for (int i = 0; i < N; i++)
{
cin >> Ai >> Bi;
value.push_back(Ai);
path[i] = (Bi - 1);
}
int result = GetMaxScore(path,value);
cout << result << endl;
}
return 0;
}
int GetMaxScore(vector<int> &vec, vector<int> value)
{
vector<bool> isvisited(vec.size(), false);
int result = -99999999;
for (int i = 4; i < vec.size(); i++)
{
int j = i;
int result1 = 0;
int times = 1;
int Max = -9999;
while (vec[j] != -1 && times <= vec.size())
{
if (!isvisited[j])
{
result1 += value[j];
}
if (result1 > Max)
{
Max = result1;
}
j = vec[j];
times++;
}
isvisited = vector<bool>(vec.size(), false);
if (result < Max)
result = Max;
}
return result;
}