For problem statement at 1000-1999/1200-1299/1270-1279/1278/problemD.txt this is a correct solution, but verifier at 1000-1999/1200-1299/1270-1279/1278/verifierD.go ends with All tests passed can you fix the verifier? package main
import (
"io"
"os"
)
type DSU struct {
p []int
sz []int
}
func NewDSU(n int) *DSU {
p := make([]int, n+1)
sz := make([]int, n+1)
for i := 1; i <= n; i++ {
p[i] = i
sz[i] = 1
}
return &DSU{p: p, sz: sz}
}
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) bool {
ra := d.Find(a)
rb := d.Find(b)
if ra == rb {
return false
}
if d.sz[ra] < d.sz[rb] {
ra, rb = rb, ra
}
d.p[rb] = ra
d.sz[ra] += d.sz[rb]
return true
}
type Fenwick struct {
n int
maxPow int
bit []int
}
func NewFenwick(n int) *Fenwick {
mp := 1
for (mp << 1) <= n {
mp <<= 1
}
return &Fenwick{
n: n,
maxPow: mp,
bit: make([]int, n+1),
}
}
func (f *Fenwick) Add(i, delta int) {
for i <= f.n {
f.bit[i] += delta
i += i & -i
}
}
func (f *Fenwick) Sum(i int) int {
res := 0
for i > 0 {
res += f.bit[i]
i -= i & -i
}
return res
}
func (f *Fenwick) Kth(k int) int {
idx := 0
b := f.maxPow
for b > 0 {
next := idx + b
if next <= f.n && f.bit[next] < k {
idx = next
k -= f.bit[next]
}
b >>= 1
}
return idx + 1
}
func nextInt(data []byte, idx *int) int {
n := len(data)
for *idx < n && (data[*idx] < '0' || data[*idx] > '9') {
*idx++
}
val := 0
for *idx < n && data[*idx] >= '0' && data[*idx] <= '9' {
val = val*10 + int(data[*idx]-'0')
*idx++
}
return val
}
func main() {
data, _ := io.ReadAll(os.Stdin)
idx := 0
n := nextInt(data, &idx)
m := 2 * n
l := make([]int, n+1)
r := make([]int, n+1)
event := make([]int, m+1)
for i := 1; i <= n; i++ {
li := nextInt(data, &idx)
ri := nextInt(data, &idx)
l[i] = li
r[i] = ri
event[li] = i
event[ri] = -i
}
dsu := NewDSU(n)
fw := NewFenwick(m)
active := make([]int, m+1)
edges := 0
for pos := 1; pos <= m; pos++ {
id := event[pos]
if id > 0 {
ri := r[id]
cnt := fw.Sum(ri - 1)
if edges+cnt > n-1 {
os.Stdout.WriteString("NO")
return
}
for k := 1; k <= cnt; k++ {
rp := fw.Kth(k)
other := active[rp]
if !dsu.Union(id, other) {
os.Stdout.WriteString("NO")
return
}
edges++
}
fw.Add(ri, 1)
active[ri] = id
} else {
id = -id
ri := r[id]
fw.Add(ri, -1)
active[ri] = 0
}
}
if edges == n-1 {
os.Stdout.WriteString("YES")
} else {
os.Stdout.WriteString("NO")
}
}