Submission

Status:

(PPPPPP)(-SSSSS)(PPPPPP)(-SSSSSSS)(-SSSSS)(-SSSSSSSSSSSS)

Subtask/Task Score:

{13/13}{0/11}{10/10}{0/16}{0/18}{0/32}

Score: 23

User: KantaponZ

Problemset: Tech Sprites

Language: cpp

Time: 1.004 second

Submitted On: 2025-06-10 22:21:56

#include <bits/stdc++.h>
using namespace std;

int n, m, ct = 0;
int pa[1000001];
int num[1000001];
map<pair<int,int>,int> ab;
queue<int> order;

int find_pa(int n) {
    if (pa[n] == n) {
        return n;
    }
    return pa[n] = find_pa(pa[n]);
}

int main() {
    ios_base::sync_with_stdio(0), cin.tie(0);
    cin >> n >> m;
    for (int i = 1; i <= n; i++) {
        pa[i] = i;
        num[i] = 1;
        int a, b;
        cin >> a >> b;
        ab[{a, b}] = i;
    }
    for (auto [x, i] : ab) {
        // cout << i << " ";
        order.push(i);
    }
    while (m--) {
        int u, v;
        cin >> u >> v;
        int pu = find_pa(u), pv = find_pa(v);
        if (pu != pv) {
            num[pu] += num[pv];
            pa[pu] = pv;
        }
    }

    int ct = 0;
    int prev = order.front();
    while (!order.empty()) {
        int x = order.front();
        order.pop();
        int px = find_pa(x), pp = find_pa(prev);
        if (px != pp && num[pp] != 0) {
            ct++;
            num[pp] += num[px];
            pa[px] = pp;
        }
        num[px]--;
    }

    cout << ct;
}