#ifndef ONLINE_JUDGE #define _GLIBCXX_DEBUG #endif #include #include using namespace std; using ll=long long; using ld=long double; using st=string; using P=pair; typedef atcoder::modint mint; ll inf=9e18; template constexpr auto max(T... a){return max(initializer_list>{a...});} template constexpr auto min(T... a){return min(initializer_list>{a...});} template auto vec(const ll (&sizes)[s], const T& init = T()){ if constexpr(i < s) return vector(sizes[i], vec(sizes, init)); else return init; } void tp_dfs(vector> &v,vector &q,ll s,stack &sorted){ q[s]=0; for(auto i:v[s]) if(q[i]) tp_dfs(v,q,i,sorted); sorted.push(s); } void tpsort(vector> &v,stack &sorted){ ll n=v.size(); vector q(n,1); for(ll i=0;i> &v,vector &q,ll s,vector> &list){ q[s]=0; list[list.size()-1].push_back(s); for(auto i:v[s]){ if(q[i]) scc_dfs(v,q,i,list); } } void scc(vector> &v,vector> &rv,vector> &list){ stack sorted; tpsort(v,sorted); ll n=v.size(); vector q(n,1); while(!sorted.empty()){ ll i=sorted.top(); sorted.pop(); if(q[i]){ list.push_back(vector(0)); scc_dfs(rv,q,i,list); } } } int main(){ ll n,x,mans=0; cin>>n; auto v=vec({n,0},0); auto rv=vec({n,0},0); auto rv2=vec({n},0); for(ll i=0;i>x; v[i].push_back(--x); rv[x].push_back(i); } queue q; for(ll i=0;i({0,0},0); scc(v,rv,list); cout<