#include using namespace std; #include #include #include namespace atcoder { struct dsu { public: dsu() : _n(0) {} explicit dsu(int n) : _n(n), parent_or_size(n, -1) {} int merge(int a, int b) { assert(0 <= a && a < _n); assert(0 <= b && b < _n); int x = leader(a), y = leader(b); if (x == y) return x; if (-parent_or_size[x] < -parent_or_size[y]) std::swap(x, y); parent_or_size[x] += parent_or_size[y]; parent_or_size[y] = x; return x; } bool same(int a, int b) { assert(0 <= a && a < _n); assert(0 <= b && b < _n); return leader(a) == leader(b); } int leader(int a) { assert(0 <= a && a < _n); if (parent_or_size[a] < 0) return a; return parent_or_size[a] = leader(parent_or_size[a]); } int size(int a) { assert(0 <= a && a < _n); return -parent_or_size[leader(a)]; } std::vector> groups() { std::vector leader_buf(_n), group_size(_n); for (int i = 0; i < _n; i++) { leader_buf[i] = leader(i); group_size[leader_buf[i]]++; } std::vector> result(_n); for (int i = 0; i < _n; i++) { result[i].reserve(group_size[i]); } for (int i = 0; i < _n; i++) { result[leader_buf[i]].push_back(i); } result.erase( std::remove_if(result.begin(), result.end(), [&](const std::vector& v) { return v.empty(); }), result.end()); return result; } private: int _n; std::vector parent_or_size; }; } // namespace atcoder using namespace atcoder; using ll = long long; using ld = long double; #define fi first #define se second #define pb push_back int main(){ int n,m,s,t; cin>>n>>m>>s>>t; s--; t--; int p[n]; int copy[n]; int newnumber[n]; int oldnumber[n]; int newp[n]; for(int i=0;i>p[i]; copy[i]=p[i]; } sort(copy,copy+n); reverse(copy,copy+n); map rank; //rank[順位]=人数 map seen; for(int i=0;i> graph(n); for(int i=0;i>a>>b; a--; b--; a=newnumber[a],b=newnumber[b]; graph[a].pb(b); graph[b].pb(a); } int dp[n]; int dp2[n]; dsu d(n); for(int i=0;inewp[i]){ dp[i]=max(dp[i],dp[p]+1); } else{ dp[i]=max(dp[i],dp[p]); } d.merge(next,i); int r=d.leader(i); dp[r]=max(dp[r],dp[i]); dp2[r]=min({dp2[r],dp2[q],dp2[p],newp[i],newp[next]}); } } } } int ans=0; for(int i=0;i