Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- using namespace std;
- #define endl '\n'
- #define pb push_back
- const int MAXN = 2e5+9;
- /*-----------------------------------------------------------------------------------------------------*/
- int pa[MAXN], sz[MAXN];
- int fnd(int x) {return(x==pa[x]?x:pa[x]=fnd(pa[x]));}
- bool uni(int a, int b) {
- if((a=fnd(a))==(b=fnd(b))) return false;
- if(sz[a]>sz[b]) swap(a, b);
- pa[a]=b; sz[b]+=sz[a];
- return true;
- }
- //O(mlogn+nlogn)
- int main() {
- ios::sync_with_stdio(0); cin.tie(NULL);
- for(int i = 0; i < MAXN; i++) pa[i]=i, sz[i]=1;
- int n, m, a, b, ans=0, nm=0, cur;
- cin >> n >> m;
- vector<int> edge[MAXN];
- for(int i = 0; i <m; i++) {
- cin >> a >> b;
- if(a>b) swap(a, b);
- edge[a].pb(b);
- uni(a, b);
- }//O(mlogn)
- for(int i = 1; i <= n; i++) {
- cur=0;
- for(int x: edge[i]) {
- cur=max(cur, x);
- }//O(n+m)
- if(cur==0) continue;
- for(int j = cur; j> max(nm, i); j--) {
- if(uni(i, j)) {
- ans++;
- }
- }//O(n+nlogn)
- if((nm=cur)==n) break;
- }
- cout << ans <<endl;
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement