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: tHeNyXs
Problemset: Tech Sprites
Language: cpp
Time: 0.659 second
Submitted On: 2026-04-24 23:57:05
#include <bits/stdc++.h>
using namespace std;
#define tu tuple<int, int, int>
const int N = 1e6+5;
int p[N];
int vis[N];
int find(int u) {
if (p[u] == u) return p[u];
return p[u] = find(p[u]);
}
int main() {
ios_base::sync_with_stdio(false); cin.tie(nullptr);
int n, m; cin >> n >> m;
iota(p, p+N, 0);
vector<tu> tech;
for (int i = 1; i <= n; ++i) {
int a, b; cin >> a >> b;
tech.emplace_back(a, b, i);
}
while (m--) {
int u, v; cin >> u >> v;
int pu = find(u), pv = find(v);
if (pu == pv) continue;
p[pu] = pv;
}
sort(tech.begin(), tech.end());
map<int, int> cnt;
for (int i = 1; i <= n; ++i) {
int idx = find(i);
cnt[idx]++;
}
int prev = find(get<2>(tech[0]));
cnt[prev]--;
int ans = 0;
// for (auto[x, y, i] : tech) {
// cout << find(i) << ' ';
// }
// cout << '\n';
// for (auto i : cnt) {
// cout << i.first << " : " << i.second << '\n';
// }
for (int i = 1; i < tech.size(); ++i) {
auto[a, b, idx] = tech[i];
idx = find(idx);
prev = find(prev);
if (idx != prev && cnt[prev]) {
// cout << "idx : " << idx << " | prev : " << prev << " | Left : " << cnt[prev] << '\n';
cnt[idx] += cnt[prev];
p[prev] = idx;
ans++;
}
cnt[idx]--;
prev = idx;
}
cout << ans;
return 0;
}