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

Problemset: Tech Sprites

Language: cpp

Time: 1.306 second

Submitted On: 2025-05-24 19:25:50

/*
STATEMENT: https://api.otog.in.th/problem/doc/1086
FILE: toi21_tech_sprites.cpp
AUTHOR: Win [Discord: @un.de.fined, Github: https://github.com/Winzzwz]
TIME: 5/24/2025, 4:22:10 PM
LANG: C++
*/

#include <bits/stdc++.h>
using namespace std;
using ll = long long;
using pii = pair<int,int>;

struct hee {
    int a,b,idx;
    bool operator < (const hee&o) const {
        if (a != o.a) return a < o.a;
        return b < o.b;
    }
};

int n,m,a,b,ans,p[1000010],sz[1000010],mx[1000010],mn[1000010],r[1000010],gmn[1000010];
hee t[1000010], temp[1000010];
set<pii> st;

int fr(int i) {
    if (i == p[i]) return i;
    return p[i] = fr(p[i]);
}

int uni(int u, int v) {
    u = fr(u); v = fr(v);
    if (u == v) return 0;
    p[u] = v;
    sz[v] += sz[u];
    sz[u] = 0;
    mx[v] = max(mx[v],mx[u]);
    mn[v] = min(mn[v],mn[u]);
    return 1;
}

int main() {
    // cin.tie(0)->sync_with_stdio(0);
    scanf("%d %d",&n,&m);
    for (int i = 1; i <= n; i++) {
        p[i] = mx[i] = mn[i] = i;
        sz[i] = 1;
    }
    for (int i = 1; i <= n; i++) {
        scanf("%d %d",&a,&b);
        t[i] = {a,b,i};
        temp[i] = {a,b,i};
    }
    sort(t+1,t+1+n);
    for (int i = 1; i <= n; i++) {
        r[t[i].idx] = i;
    }
    while (m--) {
        scanf("%d %d",&a,&b);
        int aidx = r[a], bidx = r[b];
        uni(aidx,bidx);
    }
    for (int i = 1; i <= n; i++) {
        st.insert({mn[fr(i)],fr(i)});
        gmn[fr(i)] = mn[fr(i)];
    }
    int kuy = 1;
    for (auto xx : st) {
        int x = xx.second;
        if (mx[x]-mn[x]+1 == sz[x] || mx[x] < kuy) continue;
        for (int i = gmn[x]; i <= mx[x]; i++) {
            if (uni(i,x)) ans++;
            gmn[x] = i;
            kuy = i;
            if (mx[x]-mn[x]+1 == sz[x]) break;
        }
    }
    printf("%d",ans);
    return 0;
}