#include using namespace std; using ll = long long; class dsu{ public: dsu()=default; explicit dsu(size_t n):m_parentsOrSize(n,-1){} int leader(int i){ if (m_parentsOrSize[i]<0)return i; return(m_parentsOrSize[i]=leader(m_parentsOrSize[i])); } int merge(int a,int b){ a=leader(a); b=leader(b); if (a!=b){ if(-m_parentsOrSize[a]<-m_parentsOrSize[b])std::swap(a,b); m_parentsOrSize[a]+=m_parentsOrSize[b]; m_parentsOrSize[b]=a; } return leader(a); } bool same(int a,int b){return(leader(a)==leader(b));} int size(int i){return -m_parentsOrSize[leader(i)];} std::vector>groups(){ size_t n=m_parentsOrSize.size(); std::vector>A(n); for(int i=0;i>res; for(auto a:A)if(a.size())res.emplace_back(a); return res; } private: std::vectorm_parentsOrSize; }; int main() { ios::sync_with_stdio(false); cin.tie(nullptr); int N;cin>>N; vectorL(N),S(N); ll ans=0; for(int i=0;i>L[i]>>S[i]; ans+=L[i]; } dsu uf(N); for(int i=0;i vis(N); for(auto&g:grps){ auto u=g[0]; while(!vis[u]){ vis[u]=1; u=S[u]-1; } vector cycle; while(vis[u]){ vis[u]=0; cycle.emplace_back(u); u=S[u]-1; } ll m=1e18; for(auto&x:cycle){ m=min(m,L[x]); vis[m]=0; } ans+=m; } cout<<(ans>>1)<<((ans&1)?".5":".0")<