#include <bits/stdc++.h>
using namespace std;
 
 
#define all(x) x.begin(), x.end()
#define mod 1000000007
#define sp << " " <<
#define endl << '\n'
long long int N;
vector<int> forwrd;
vector<vector<int>> backwrd;
vector<int> vis;
vector<int> len;
vector<int> nd;
void dfs(int n){
    if (vis[n])
        return;
    vis[n] = true;
    for (auto k : backwrd[n]){
        len[k] = len[n] + 1;
        dfs(k);
    }
}
int main(){
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    cout.tie(NULL);
    cin >> N;
    len.resize(N, -1);
    vis.resize(N);
    forwrd.resize(N);
    backwrd.resize(N);
    for (int i = 0; i < N; i++){
        cin >> forwrd[i];
        if (forwrd[i] == -1){
            nd.push_back(i);
            len[i] = 0;
        }else
            backwrd[forwrd[i]].push_back(i);
    }
    for (auto k : nd)
        dfs(k);
    multiset<int> que;
    for (int i = 0; i < N; i++)
        que.insert(-len[i]);
    int ret = max(0, len[0]);
    if (len[0] == -1){
        fill(all(vis), false);
        int j = 1, u = 0;
        while (vis[forwrd[u]] == 0){
            vis[u] = true;
            j++;
            u = forwrd[u];
            vis[u] = true;
        }
        ret = j + -*que.begin() + 1;
    }else{
        fill(all(vis), 0);
        int j = 1, u = 0;
        while (true){
            stack<int> stc;
            stc.push(u);
            vis[u] = true;
            while (stc.size()){
                int f = stc.top();
                stc.pop();
                que.erase(que.find(-len[f]));
                for (auto k : backwrd[f])
                    if (vis[k] == 0){
                        vis[k] = true;
                        stc.push(k);
                    }
            }
            j++;
            if (que.size())
                ret = max(ret, j + -*que.begin());
            if (forwrd[u] == -1)
                break;
            u = forwrd[u];
        }
    }
    cout << ret;
}
| # | 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... |