For problem statement at 1000-1999/1600-1699/1630-1639/1633/problemE.txt this is a correct solution, but verifier at 1000-1999/1600-1699/1630-1639/1633/verifierE.go ends with case 1 failed: expected 14 got 0
input:
2 2
1 2 18
1 2 2
3 5 3 1 12
11 0 8
exit status 1 can you fix the verifier? ```go
package main
import (
"bufio"
"fmt"
"os"
"sort"
)
// Global variables to reduce allocation overhead
var (
sortCosts []int
sortIndices []int
edges []Edge
)
type Edge struct {
u, v, w, id int
}
type QueryInterval struct {
limit int
A, B int64
}
type DSU struct {
parent []int
}
func NewDSU(n int) *DSU {
p := make([]int, n+1)
for i := range p {
p[i] = i
}
return &DSU{parent: p}
}
func (d *DSU) Find(i int) int {
if d.parent[i] != i {
d.parent[i] = d.Find(d.parent[i])
}
return d.parent[i]
}
func (d *DSU) Union(i, j int) bool {
rootI := d.Find(i)
rootJ := d.Find(j)
if rootI != rootJ {
d.parent[rootI] = rootJ
return true
}
return false
}
func (d *DSU) Reset() {
for i := range d.parent {
d.parent[i] = i
}
}
// Implement sort.Interface
type byCost struct{}
func (byCost) Len() int { return len(sortIndices) }
func (byCost) Swap(i, j int) {
sortIndices[i], sortIndices[j] = sortIndices[j], sortIndices[i]
}
func (byCost) Less(i, j int) bool {
c1 := sortCosts[sortIndices[i]]
c2 := sortCosts[sortIndices[j]]
if c1 != c2 {
return c1 < c2
}
return sortIndices[i] < sortIndices[j]
}
func main() {
reader := bufio.NewReader(os.Stdin)
writer := bufio.NewWriter(os.Stdout)
defer writer.Flush()
var n, m int
if _, err := fmt.Fscan(reader, &n, &m); err != nil {
return
}
edges = make([]Edge, m)
for i := 0; i < m; i++ {
fmt.Fscan(reader, &edges[i].u, &edges[i].v, &edges[i].w)
edges[i].id = i
}
pointSet := make(map[int]struct{})
for i := 0; i < m; i++ {
pointSet[edges[i].w] = struct{}{}
for j := i + 1; j < m; j++ {
mid := (edges[i].w + edges[j].w) / 2
pointSet[mid] = struct{}{}
}
}
points := make([]int, 0, len(pointSet))
for p := range pointSet {
if p >= 0 {
points = append(points, p)
}
}
sort.Ints(points)
sortCosts = make([]int, m)
sortIndices = make([]int, m)
intervals := make([]QueryInterval, 0, len(points)+1)
dsu := NewDSU(n)
prevLim := -1
process := func(limit int) {
L := prevLim + 1
R := limit
if L > R {
return
}
for i := 0; i < m; i++ {
c := edges[i].w - L
if c < 0 {
c = -c
}
sortCosts[i] = c
sortIndices[i] = i
}
sort.Sort(byCost{})
dsu.Reset()
var sumA, sumB int64
for _, idx := range sortIndices {
e := edges[idx]
if dsu.Union(e.u, e.v) {
if e.w >= L {
sumA -= 1
sumB += int64(e.w)
} else {
sumA += 1
sumB -= int64(e.w)
}
}
}
intervals = append(intervals, QueryInterval{limit: R, A: sumA, B: sumB})
}
for _, p := range points {
process(p)
prevLim = p
}
process(200000000)
var p, k int
var a, b, c int64
fmt.Fscan(reader, &p, &k, &a, &b, &c)
qs := make([]int64, p)
for i := 0; i < p; i++ {
fmt.Fscan(reader, &qs[i])
}
var totalXor int64
var lastQ int64
nIntervals := len(intervals)
for i := 0; i < k; i++ {
var q int64
if i < p {
q = qs[i]
} else {
q = (lastQ*a + b) % c
}
lastQ = q
l, r := 0, nIntervals-1
idx := nIntervals - 1
qInt := int(q)
for l <= r {
mid := (l + r) >> 1
if intervals[mid].limit >= qInt {
idx = mid
r = mid - 1
} else {
l = mid + 1
}
}
inter := intervals[idx]
ans := inter.A*q + inter.B
totalXor ^= ans
}
fmt.Fprintln(writer, totalXor)
}
```