← Home
For problem statement at 0-999/400-499/450-459/455/problemC.txt this is a correct solution, but verifier at 0-999/400-499/450-459/455/verifierC.go ends with All 101 tests passed can you fix the verifier? package main

import (
	"bufio"
	"io"
	"os"
	"strconv"
)

type DSU struct {
	parent []int
	size   []int
}

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

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

func (d *DSU) Union(a, b int) int {
	a = d.Find(a)
	b = d.Find(b)
	if a == b {
		return a
	}
	if d.size[a] < d.size[b] {
		a, b = b, a
	}
	d.parent[b] = a
	d.size[a] += d.size[b]
	return a
}

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()
	q := nextInt()

	adj := make([][]int, n+1)
	dsu := NewDSU(n)

	for i := 0; i < m; i++ {
		a := nextInt()
		b := nextInt()
		adj[a] = append(adj[a], b)
		adj[b] = append(adj[b], a)
		dsu.Union(a, b)
	}

	diam := make([]int, n+1)
	seenRoot := make([]bool, n+1)
	queue := make([]int, n+1)
	dist := make([]int, n+1)
	mark := make([]int, n+1)
	stamp := 0

	bfs := func(start int) (int, int) {
		stamp++
		head, tail := 0, 0
		queue[tail] = start
		tail++
		mark[start] = stamp
		dist[start] = 0
		far, maxd := start, 0

		for head < tail {
			v := queue[head]
			head++
			dv := dist[v]
			if dv > maxd {
				maxd = dv
				far = v
			}
			for _, to := range adj[v] {
				if mark[to] != stamp {
					mark[to] = stamp
					dist[to] = dv + 1
					queue[tail] = to
					tail++
				}
			}
		}
		return far, maxd
	}

	for i := 1; i <= n; i++ {
		r := dsu.Find(i)
		if !seenRoot[r] {
			seenRoot[r] = true
			far, _ := bfs(i)
			_, d := bfs(far)
			diam[r] = d
		}
	}

	out := bufio.NewWriterSize(os.Stdout, 1<<20)
	defer out.Flush()

	for i := 0; i < q; i++ {
		t := nextInt()
		if t == 1 {
			x := nextInt()
			r := dsu.Find(x)
			out.WriteString(strconv.Itoa(diam[r]))
			out.WriteByte('\n')
		} else {
			x := nextInt()
			y := nextInt()
			rx := dsu.Find(x)
			ry := dsu.Find(y)
			if rx == ry {
				continue
			}
			dx := diam[rx]
			dy := diam[ry]
			nd := dx
			if dy > nd {
				nd = dy
			}
			tm := (dx+1)/2 + (dy+1)/2 + 1
			if tm > nd {
				nd = tm
			}
			r := dsu.Union(rx, ry)
			diam[r] = nd
		}
	}
}