← Home
For problem statement at 1000-1999/1200-1299/1250-1259/1253/problemD.txt this is a correct solution, but verifier at 1000-1999/1200-1299/1250-1259/1253/verifierD.go ends with All tests passed can you fix the verifier? package main

import (
	"fmt"
	"io"
	"os"
)

type DSU struct {
	p  []int
	sz []int
	mx []int
}

func NewDSU(n int) *DSU {
	p := make([]int, n+1)
	sz := make([]int, n+1)
	mx := make([]int, n+1)
	for i := 1; i <= n; i++ {
		p[i] = i
		sz[i] = 1
		mx[i] = i
	}
	return &DSU{p: p, sz: sz, mx: mx}
}

func (d *DSU) Find(x int) int {
	for d.p[x] != x {
		d.p[x] = d.p[d.p[x]]
		x = d.p[x]
	}
	return x
}

func (d *DSU) Union(a, b int) int {
	ra := d.Find(a)
	rb := d.Find(b)
	if ra == rb {
		return ra
	}
	if d.sz[ra] < d.sz[rb] {
		ra, rb = rb, ra
	}
	d.p[rb] = ra
	d.sz[ra] += d.sz[rb]
	if d.mx[rb] > d.mx[ra] {
		d.mx[ra] = d.mx[rb]
	}
	return ra
}

func main() {
	data, _ := io.ReadAll(os.Stdin)
	idx := 0
	nextInt := func() int {
		for idx < len(data) && (data[idx] < '0' || data[idx] > '9') {
			idx++
		}
		val := 0
		for idx < len(data) && data[idx] >= '0' && data[idx] <= '9' {
			val = val*10 + int(data[idx]-'0')
			idx++
		}
		return val
	}

	n := nextInt()
	m := nextInt()

	dsu := NewDSU(n)
	for i := 0; i < m; i++ {
		u := nextInt()
		v := nextInt()
		dsu.Union(u, v)
	}

	ans := 0
	for i := 1; i <= n; {
		root := dsu.Find(i)
		right := dsu.mx[root]
		for j := i + 1; j <= right; j++ {
			rj := dsu.Find(j)
			if rj != root {
				ans++
				root = dsu.Union(root, rj)
				if dsu.mx[root] > right {
					right = dsu.mx[root]
				}
			}
		}
		i = right + 1
	}

	fmt.Print(ans)
}