OIG XIV - spe

// https://szkopul.edu.pl/problemset/problem/e0qogVe4A5ivK_pTdUXL39FV/site/?key=statement

#include <iostream>
#include <limits.h>
#include <queue>
#include <vector>

const int sizik = 1000 * 1000 + 8;
bool arr[sizik];
// bool odw[sizik];
int deg[sizik];
int nast[sizik];

void DFS(int v, long long& temp) {
    if (arr[v]) {
        return;
    }

    temp += v;
    arr[v] = true;

    DFS(nast[v], temp);
}

int main() {
    std::ios_base::sync_with_stdio(0);

    int n;
    std::cin >> n;

    for (int i = 1; i <= n; i++) {
        int a;
        std::cin >> a;

        nast[i] = a;
        deg[nast[i]]++;
    }

    std::queue<int> du;

    for (int i = 1; i <= n; i++) {
        if (deg[i] == 0) {
            du.push(i);
        }
    }

    while (!du.empty()) {
        int v = du.front();
        du.pop();
        arr[v] = true;

        int u = nast[v];
        deg[u]--;
        if (deg[u] == 0) {
            du.push(u);
        }
    }

    long long wynik = LLONG_MAX;

    for (int i = 1; i <= n; i++) {
        if (!arr[i]) {
            long long temp = 0;
            DFS(i, temp);
            wynik = std::min(wynik, temp);
        }
    }

    std::cout << wynik << '\n';

    return 0;
}