#include <bits/stdc++.h>
using namespace std;
const int MAX = 1e6+5;
struct Edge{
int i,x;
long long d;
Edge(){};
Edge(int a, int b, long long c){i=a;x=b;d=c;};
};
int N;
long long D[MAX],Ans,Len;
bool vE[MAX],vN[MAX],isL[MAX];
vector<Edge> I[MAX];
stack<int> L;
vector<int> Lp;
vector<long long> A,B,C,dis;
void DFS(int i)
{
if(vN[i]){
Lp.push_back(i);
isL[i] = true;
while(L.top()!=i){
Lp.push_back(L.top());
isL[L.top()] = true;
L.pop();
}
return;
}
vN[i] = true;
L.push(i);
for(auto it : I[i]){
if(vE[it.i]) continue;
vE[it.i] = true;
DFS(it.x);
}
if(!L.empty()) L.pop();
}
long long getD(int x, long long d, int r)
{
long long res=0,tmp=0,subm=0;
for(auto it : I[x]){
if(isL[it.x] || it.x==r) continue;
tmp = getD(it.x,it.d,x);
if(res<=tmp){
subm = res;
res = tmp;
}
else subm = max(subm,tmp);
Len = max(Len,subm+res);
}
return res+d;
}
long long getL()
{
long long res=0,tmp;
int n = Lp.size();
Len = 0;
for(int i=0; i<n; i++)
{
for(auto it : I[Lp[i]]){
if(it.x==Lp[(i+1)%n]) dis.push_back(it.d);
}
D[Lp[i]] = getD(Lp[i],0,Lp[i]);
}
res = Len;
A.push_back(D[Lp[0]]);
for(int i=1; i<n; i++) A.push_back(A[i-1]+D[Lp[i]]-D[Lp[i-1]]+dis[i-1]);
for(int i=0; i<n; i++) B.push_back(A[i]-D[Lp[i]]*2);
C.push_back(D[Lp[n-1]]+dis[n-1]);
for(int i=1; i<n-1; i++) C.push_back(C[i-1]+D[Lp[n-1-i]]-D[Lp[n-i]]+dis[n-1-i]);
tmp = B[0];
res = max(res,A[1] - B[0]);
for(int i=2; i<n; i++){
tmp = min(tmp,B[i-1]);
res = max(res,A[i] - tmp);
}
tmp = A[0];
res = max(res,C[n-2] + A[0]);
for(int i=n-3; i>=0; i--){
tmp = max(tmp,A[n-2-i]);
res = max(res,C[i] + tmp);
}
return res;
}
int main()
{
cin >> N;
for(int i=1; i<=N; i++){
int x;
long long d;
cin >> x >> d;
I[i].push_back(Edge(i,x,d));
I[x].push_back(Edge(i,i,d));
}
for(int j=1; j<=N; j++){
if(vN[j]) continue;
while(!Lp.empty()) Lp.pop();
while(!A.empty()) A.pop();
while(!B.empty()) B.pop();
while(!C.empty()) C.pop();
while(!dis.empty()) dis.pop();
DFS(j);
Ans += getL();
}
cout << Ans;
}
/*8
3 8
7 2
4 2
1 4
1 17
3 4
2 3
1 15
*/
Compilation message
islands.cpp: In function 'int main()':
islands.cpp:102:31: error: 'class std::vector<int>' has no member named 'pop'
while(!Lp.empty()) Lp.pop();
^~~
islands.cpp:103:29: error: 'class std::vector<long long int>' has no member named 'pop'
while(!A.empty()) A.pop();
^~~
islands.cpp:104:29: error: 'class std::vector<long long int>' has no member named 'pop'
while(!B.empty()) B.pop();
^~~
islands.cpp:105:29: error: 'class std::vector<long long int>' has no member named 'pop'
while(!C.empty()) C.pop();
^~~
islands.cpp:106:33: error: 'class std::vector<long long int>' has no member named 'pop'
while(!dis.empty()) dis.pop();
^~~