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: Xapitize

Problemset: Tech Sprites

Language: cpp

Time: 0.636 second

Submitted On: 2026-03-20 20:45:07

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

#define ll long long
#define all(x) (x).begin(), (x).end()

vector<int> parent(1e6+2);

int findRoot(int u)
{
    if(parent[u]==u) return u;
    return parent[u] = findRoot(parent[u]);
}

void uni(int u, int v)
{
    if(findRoot(u) != findRoot(v))
    {
        parent[findRoot(u)] = parent[findRoot(v)];
    }
}

int main()
{
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    int n,m;
    cin >> n >> m;
    vector<pair<int,int>> spirits(n+1); // shy , spark
    spirits[0] = {0,0};
    for(int i=1;i<=n;i++)
    {
        int a,b;
        cin >> a >> b;
        spirits[i] = {a,b};
    }
    for(int i=1;i<=n;i++)
    {
        parent[i]=i;
    }
    for(int i=0;i<m;i++)
    {
        int x,y;
        cin >> x >> y;
        uni(x,y);
    }
    vector<pair<pair<int,int>,int>> group;
    vector<int> groupcount(1e6+2,0);
    vector<bool> connectedgroup(n+1,false);
    int ans = 0;
    for(int i=1;i<=n;i++)
    {
        group.emplace_back(spirits[i],findRoot(i));
        groupcount[findRoot(i)]++;
    }
    sort(all(group));
    // for(int i=1;i<=n;i++)
    // {
    //     cout << group[i-1].second << " ";
    // }
    // cout << "\n";
    for(int i=1;i<=n-1;i++)
    {
        groupcount[findRoot(group[i-1].second)]--;
        if(findRoot(group[i-1].second)!=findRoot(group[i].second) && groupcount[findRoot(group[i-1].second)]>=1)
        {
            groupcount[findRoot(group[i-1].second)] = groupcount[findRoot(group[i-1].second)]+groupcount[findRoot(group[i].second)];
            groupcount[findRoot(group[i].second)] = 0;
            uni(group[i].second,group[i-1].second);
            // for(int i=1;i<=n;i++)
            // {
            //     cout << findRoot(group[i-1].second) << " ";
            // }
            // cout << "\n";
            ans++;
        }
    }
    cout << ans;
    // for(int i : subgroup)
    // {
    //     sort(all(group[i]));
    // }
    // for(int i : subgroup)
    // {
    //     bool stop = false;
    //     for(int j=0;j<group[i].size();j++)
    //     {
    //         if(!st.empty())
    //         {
    //             while(stop==false)
    //             {
    //                 if(st.empty()) stop=true;
    //                 else if(group[i][j].first<st.top().first.first)
    //                 {
    //                     stop = true;
    //                 }
    //                 else if(group[i][j].first==st.top().first.first && group[i][j].second < st.top().first.second)
    //                 {
    //                     stop = true;
    //                 }
    //                 else
    //                 {
    //                     if(poppedgroup[st.top().second]==false)
    //                     {
    //                         ans++;
    //                         poppedgroup[st.top().second] = true;
    //                     }
    //                     st.pop();
    //                 }
    //             }
    //         }
    //         st.push({group[i][j],i});
    //     }
    // }
    return 0;
}