This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#include <bits/stdc++.h>
using namespace std;
const int Nmax = 1e5 + 5;
typedef long long ll;
int to[Nmax], cost[Nmax], mx1[Nmax], mx2[Nmax];
vector<int> v[Nmax];
ll ans = 0;
int used[Nmax];
int in_solve, in_cycle;
int n;
void upd(int &mx1, int &mx2, int cost)
{
    if(cost >= mx1) mx2 = mx1, mx1 = cost;
        else if(cost > mx2) mx2 = cost;
}
void mark(int node)
{
    used[node] = 2;
    for(auto it : v[node])
        if(used[it] != 2)
            mark(it);
}
int solve(int node)
{
    ++in_solve;
    while(!used[node])
    {
        used[node] = 1;
        node = to[node];
    }
    mark(node);
    int start = node;
    int ans = 2e9;
    do
    {
        if(mx1[to[node]] > cost[node])
            ans = 0;
        else ans = min(ans, mx1[to[node]] - mx2[to[node]]);
        node = to[node];
        ++in_cycle;
    }
    while(node != start);
    return ans;
}
int main()
{
  //  freopen("input", "r", stdin);
    cin.tie(0); cin.sync_with_stdio(false);
    cin >> n;
    int i;
    for(i=1; i<=n; ++i)
    {
        cin >> to[i] >> cost[i];
        v[to[i]].push_back(i);
    }
    for(i=1; i<=n; ++i)
        upd(mx1[to[i]], mx2[to[i]], cost[i]);
    for(i=1; i<=n; ++i)
        if(!used[i])
            ans += solve(i);
    for(i=1; i<=n; ++i) ans += cost[i] - mx1[i];
    if(in_cycle == n && in_solve == 1) ans = 0;
    cout << ans << '\n';
    return 0;
}
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... |