#include<bits/stdc++.h>
using namespace std;
#define int long long
const int N=1e6+5;
int fa[N],val[N],mark;
int dp[N][2];
bool vis[N];
vector<int> G[N];
void addEdge(int from,int to){
G[from].push_back(to);
fa[to]=from;
}
void dfs(int u){
dp[u][0]=0;
dp[u][1]=val[u];
vis[u]=1;
for(auto i:G[u]){
if(i==mark) continue;
dfs(i);
dp[u][1]+=dp[i][0];
dp[u][0]+=max(dp[i][0],dp[i][1]);
}
}
int check(int u){
vis[u]=1;
int f=fa[u];
if(vis[f]) return f;
else check(f);
}
int solve(int u){
int ans=0;
mark=check(u);
dfs(mark);
ans=max(ans,dp[mark][0]);
mark=fa[mark];
dfs(mark);
ans=max(ans,dp[mark][0]);
return ans;
}
signed main(){
int n;
cin>>n;
int x;
for(int i=1;i<=n;++i){
cin>>val[i]>>x;
addEdge(x,i);
}
int ans=0;
for(int i=1;i<=n;++i){
if(!vis[i]) ans+=solve(i);
}cout<<ans<<endl;
return 0;
}