#include #include #include #include #include using std::cin,std::cout; const int MAX_N {(int)2e5+5}; int n; std::vector next[MAX_N]; int in_degree[MAX_N]; bool vis[MAX_N]; std::queue q; int ans; int input; int dfs(const int start, const int now, int depth){ depth++; vis[now] = true; int max_depth{ depth }; for (int i : next[now]) { if (i == start) { max_depth = std::max(max_depth, depth); } else { max_depth = std::max(dfs(start, i, depth), max_depth); } } return max_depth; }; int main(){ std::iostream::sync_with_stdio(false),cin.tie(nullptr),cout.tie(nullptr); std::cin>>n; for(int i=1;i<=n;i++){ cin>>input; in_degree[input]++; next[i].push_back(input); } const auto push_vis = [](int n){ q.push(n); vis[n]=true; }; for(int i=1;i<=n;i++){ if(in_degree[i]<=0){ push_vis(i); } } while(q.empty()==false){ int front = q.front(); q.pop(); for(int i:next[front]){ if(--in_degree[i]<=0){ push_vis(i); } } } for(int i=1;i<=n;i++){ if(vis[i])continue; ans=std::max(ans,dfs(i,i,0)); } cout<