rt,40分,AC+WA,不知道错哪了。
#include <bits/stdc++.h>
using namespace std;
#define rep(i,a,b) for(int i=a;i<=b;i++)
#define int long long
const int N=1e6+10;
int n;
vector<tuple<int,int,int>> g[N];//v w id
int rd[N],vis[N],v2[N],v3[N],f[N],l[N];
int sum[N<<1],st[N<<1],ls[N<<1],L,R;
queue<int> q;
vector<tuple<int,int,int>> h;// u v w
void sring(int u){
v2[u]=true;
for(auto p:g[u]){
auto [i,w,id]=p;
if(!vis[i]&&!v3[id]){
v3[id]=1;
h.push_back({u,i,w});
sring(i);
}
}
}
signed main(){
ios::sync_with_stdio(0);
cin>>n;
rep(i,1,n){
int v,w;cin>>v>>w;
g[i].push_back({v,w,i});
g[v].push_back({i,w,i});
}
rep(i,1,n){
rd[i]=g[i].size();
if(rd[i]==1){
q.push(i);
}
}
while(!q.empty()){
int t=q.front();q.pop();
vis[t]=true;
for(auto p:g[t]){
auto [v,w,id]=p;
if(vis[v])continue;
rd[v]--;
if(rd[v]==1)q.push(v);
l[v]=max(l[v],f[v]+f[t]+w);
l[v]=max(l[v],l[t]);
f[v]=max(f[v],f[t]+w);
}
}
int ansl=0;
rep(i,1,n){
if(!vis[i]&&!v2[i]){
int ans=0;
h.clear();
sring(i);
for(auto p:h){
auto [u,v,w]=p;
ans=max(ans,l[u]);
}
for(int i=1;i<=2*h.size();i++){
st[i]=get<0>(h[(i-1)%h.size()]);
sum[i+1]=sum[i]+get<2>(h[(i-1)%h.size()]);
}
L=1;R=0;
auto gi=[](int w){return f[get<0>(h[(w-1)%h.size()])]-sum[w];};
auto gk=[](int w){return f[get<0>(h[(w-1)%h.size()])]+sum[w];};
rep(i,1,2*h.size()){
//cout<<gi(ls[R])<<' '<<gi(i)<<endl;
while(L<=R&&gi(ls[R])<=gi(i))R--;
while(L<=R&&(ls[L]<i-h.size()+1))L++;
if(L<=R){
ans=max(ans,gk(i)+gi(ls[L]));
}
ls[++R]=i;
}
ansl+=ans;
}
}cout<<ansl;
}