#include<bits/stdc++.h>
using namespace std;
#define printf(...) printf
#define int long long
const int N=0x100'400;
int idx=2,h[N],e[N*2],ne[N*2];
inline void ned(int a,int b) {
ne[idx]=h[a];
e[idx]=b;
h[a]=idx++;
}
inline void nd(int a,int b) {
ned(a,b);
ned(b,a);
}
#define fos(i,x) for(int ed=h[x],i=e[ed];ed;i=e[ed=ne[ed]])
int n,r[N],ht[N],ans,vis[N],dp[N][2],never;
void dfs(int x,int val) {
printf("#%d\n",x);
vis[x]=val;
dp[x][0]=0;
dp[x][1]=r[x];
fos(i,x)
if(vis[i]!=val) {
dfs(i,val);
dp[x][0]+=max(dp[i][0],dp[i][1]);
dp[x][1]+=dp[i][0];
}
if(x==never) dp[x][1]=-1e9;
printf("#%d: dp[0]=%d, dp[1]=%d\n",x,dp[x][0],dp[x][1]);
}
void test_output() {
printf("unchose #%d\n",never);
for(int i=1;i<=n;i++)
if(vis[i]);
printf("\n");
}
int work(int x) {
int now=x,ans=0;
while(vis[now]!=-x) {
vis[now]=-x;
now=ht[now];
}
int root=ht[now];
printf("del line %d->%d\n",now,root);
printf("root #%d\n",now);
never=now;
dfs(now,now);
test_output();
ans=max(dp[now][0],dp[now][1]);
never=root;
dfs(now,root);
test_output();
ans=max(dp[now][0],dp[now][1]);
return ans;
}
signed main() {
cin>>n;
for(int i=1;i<=n;i++) {
cin>>r[i]>>ht[i];
ned(ht[i],i);
}
for(int i=1;i<=n;i++)
if(!vis[i])
ans+=work(i);
cout<<ans<<endl;
return 0;
}