← Home
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 All tests passed can you fix the verifier? package main

import (
	"bufio"
	"fmt"
	"os"
	"sort"
	"strconv"
)

func main() {
	scanner := bufio.NewScanner(os.Stdin)
	scanner.Split(bufio.ScanWords)
	buf := make([]byte, 1024*1024)
	scanner.Buffer(buf, 1024*1024*10)

	scanInt := func() int {
		scanner.Scan()
		res, _ := strconv.Atoi(scanner.Text())
		return res
	}

	if !scanner.Scan() {
		return
	}
	n, _ := strconv.Atoi(scanner.Text())
	m := scanInt()

	u := make([]int, m)
	v := make([]int, m)
	w := make([]int, m)
	for i := 0; i < m; i++ {
		u[i] = scanInt() - 1
		v[i] = scanInt() - 1
		w[i] = scanInt()
	}

	p := scanInt()
	k_total := scanInt()
	a := int64(scanInt())
	b := int64(scanInt())
	c := int64(scanInt())

	queries := make([]int64, p)
	for i := 0; i < p; i++ {
		queries[i] = int64(scanInt())
	}

	M_values := make([]int, 0, m*m/2+2)
	M_values = append(M_values, -1, 200000000)
	for i := 0; i < m; i++ {
		for j := i; j < m; j++ {
			M_values = append(M_values, (w[i]+w[j])/2)
		}
	}
	sort.Ints(M_values)
	uniqueM := M_values[:1]
	for i := 1; i < len(M_values); i++ {
		if M_values[i] != M_values[i-1] {
			uniqueM = append(uniqueM, M_values[i])
		}
	}

	K := len(uniqueM) - 1
	intervalA := make([]int64, K)
	intervalB := make([]int64, K)
	intervalEnd := make([]int, K)

	edges := make([]int, m)
	for i := 0; i < m; i++ {
		edges[i] = i
	}

	parent := make([]int, n)
	for i := range parent {
		parent[i] = i
	}

	for k := 0; k < K; k++ {
		M_i := uniqueM[k]
		M_next := uniqueM[k+1]

		for j := 1; j < m; j++ {
			key := edges[j]
			idx := j - 1
			for idx >= 0 {
				e1 := key
				e2 := edges[idx]
				d1 := w[e1] - M_next
				if d1 < 0 {
					d1 = -d1
				}
				d2 := w[e2] - M_next
				if d2 < 0 {
					d2 = -d2
				}

				isLess := false
				if d1 != d2 {
					isLess = d1 < d2
				} else {
					isLess = w[e1] < w[e2]
				}

				if isLess {
					edges[idx+1] = edges[idx]
					idx--
				} else {
					break
				}
			}
			edges[idx+1] = key
		}

		for i := range parent {
			parent[i] = i
		}

		var A, B int64
		edgesUsed := 0

		for _, e := range edges {
			rootU := u[e]
			for rootU != parent[rootU] {
				rootU = parent[rootU]
			}
			curr := u[e]
			for curr != rootU {
				nxt := parent[curr]
				parent[curr] = rootU
				curr = nxt
			}

			rootV := v[e]
			for rootV != parent[rootV] {
				rootV = parent[rootV]
			}
			curr = v[e]
			for curr != rootV {
				nxt := parent[curr]
				parent[curr] = rootV
				curr = nxt
			}

			if rootU != rootV {
				parent[rootU] = rootV
				if w[e] <= M_i {
					A += 1
					B -= int64(w[e])
				} else {
					A -= 1
					B += int64(w[e])
				}
				edgesUsed++
				if edgesUsed == n-1 {
					break
				}
			}
		}

		intervalA[k] = A
		intervalB[k] = B
		intervalEnd[k] = M_next
	}

	var ans int64 = 0
	var lastQ int64

	for j := 1; j <= k_total; j++ {
		var q int64
		if j <= p {
			q = queries[j-1]
		} else {
			q = (lastQ*a + b) % c
		}
		lastQ = q

		left, right := 0, K-1
		var idx int
		for left <= right {
			mid := (left + right) / 2
			if intervalEnd[mid] >= int(q) {
				idx = mid
				right = mid - 1
			} else {
				left = mid + 1
			}
		}

		cost := intervalA[idx]*q + intervalB[idx]
		ans ^= cost
	}

	fmt.Println(ans)
}