Submission
Status:
(PPPPPP)(PPPPPP)(PPPPPP)(PPPPPPPP)(PPPPPP)(PPPPPPPPPPPPP)
Subtask/Task Score:
{13/13}{11/11}{10/10}{16/16}{18/18}{32/32}
Score: 100
User: meme_boi2
Problemset: Tech Sprites
Language: cpp
Time: 0.600 second
Submitted On: 2025-08-14 08:18:49
#include <bits/stdc++.h>
using namespace std;
#define pii pair<int,int>
#define tii tuple<int,int,int>
vector<int> pa(1e6+1),cnt(1e6+1,1);
vector<tii> mat;
int ans,n,m,cut;
int find(int i){
if(pa[i] == i) return i;
else return pa[i] = find(pa[i]);
}
void U(int u,int v){
// u = find(u);
// v= find(v);
if(u == v) pa[u] = v;
else if(u > v) {pa[u] = v; cnt[v] += cnt[u];}
else {pa[v] = u; cnt[u] += cnt[v];}
// cout << "Union " << max(cnt[u],cnt[v]) << '\n';
}
int32_t main(){
cin.tie(nullptr)->sync_with_stdio(0);
cin >> n >> m;
mat.resize(n);
for(int i = 1; i <= n; i++){
int a, b;
cin >>a >> b;
pa[i] = i;
mat[i-1] = {a,b,i};
}
sort(mat.begin(),mat.end());
while(m--){
int u, v;
cin >> u >> v;
// cnt[u]++;
//cnt[v]++;
u = find(u); v = find(v);
U(u,v);
}
//cut = 1;
// cout << find(7) << ' ' << find(1) << " BRUH\n";
for(int j = 0; j < n-1; j++){
int u = get<2>(mat[j]), v = get<2>(mat[j+1]);
if(find(u) != find(v)){
if(cnt[find(u)] > 1){
// cout << u << ' ' << v << ' ' << cnt[find(u)] << '\n';
ans += 1;
// cout << u << ' ' << v << ' ' << find(u) << " " << find(v) << ' '<< cut <<' ' << cnt[find(u)] <<" NIG \n";
// cut += cnt[find(v)];
U(find(u),find(v));
}
}
cnt[find(u)]--;
// cut++;
}
cout << ans;
}