Submission
Status:
(PPPPPP)(PP-SSS)(PPPPPP)(P-SSSSSS)(PPP-SS)(-SSSSSSSSSSSS)
Subtask/Task Score:
{13/13}{0/11}{10/10}{0/16}{0/18}{0/32}
Score: 23
User: nozmid
Problemset: Tech Sprites
Language: cpp
Time: 1.369 second
Submitted On: 2026-04-23 21:22:28
#include <bits/stdc++.h>
using namespace std;
#define emb emplace_back
struct stc{
int g, f, s;
bool operator<(const stc &o) const{
if(f != o.f) return f < o.f;
return s < o.f;
}
};
const int maxn = 1e6 + 5;
int n, m;
stc arr[maxn];
vector<int> adj[maxn];
bool vis[maxn];
int gcnt, cnt[maxn];
int pa[maxn];
stack<int> stk;
int res;
int findset(int u){
if(u == pa[u]) return u;
return pa[u] = findset(pa[u]);
}
void dfs(int u){
arr[u].g = gcnt;
for(auto e : adj[u]){
if(vis[e]) continue;
vis[e] = 1;
dfs(e);
}
}
int main(){
ios_base::sync_with_stdio(0);cin.tie(0);
cin >> n >> m;
for(int i=1;i<=n;++i){
cin >> arr[i].f >> arr[i].s;
}
for(int i=0;i<m;++i){
int u, v;
cin >> u >> v;
adj[u].emb(v);
adj[v].emb(u);
}
for(int i=1;i<=n;++i){
if(!vis[i]){
++gcnt;
vis[i] = 1;
dfs(i);
}
}
sort(arr+1, arr+1+n);
iota(pa, pa+maxn, 0);
//for(int i=1;i<=n;++i) cout << arr[i].g << " ";
for(int i=1;i<=n;++i){
int u = arr[i].g, pu = findset(u);
if(cnt[u] > 0){
while(cnt[u]){
int v = stk.top();
stk.pop();
--cnt[v];
v = findset(v);
if(pu != v){
pa[v] = pu;
++res;
}
}
}
stk.push(u);
++cnt[u];
}
cout << res;
}