← Home
For problem statement at 1000-1999/1300-1399/1340-1349/1344/problemD.txt this is a correct solution, but verifier at 1000-1999/1300-1399/1340-1349/1344/verifierD.go ends with All tests passed can you fix the verifier? ```go
package main

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

func marginal(ai, j int64) int64 {
	return ai - 3*j*j + 3*j - 1
}

func countGE(ai, x int64) int64 {
	if x > ai-1 {
		return 0
	}
	minv := ai - 3*ai*ai + 3*ai - 1
	if x <= minv {
		return ai
	}
	d := 12.0*(float64(ai)-float64(x)) - 3.0
	j := int64((3.0 + math.Sqrt(d)) / 6.0)
	if j < 0 {
		j = 0
	} else if j > ai {
		j = ai
	}
	for j < ai && marginal(ai, j+1) >= x {
		j++
	}
	for j > 0 && marginal(ai, j) < x {
		j--
	}
	return j
}

func main() {
	data, _ := io.ReadAll(os.Stdin)
	p := 0
	nextInt := func() int64 {
		for p < len(data) && (data[p] == ' ' || data[p] == '\n' || data[p] == '\r' || data[p] == '\t') {
			p++
		}
		sign := int64(1)
		if data[p] == '-' {
			sign = -1
			p++
		}
		var v int64
		for p < len(data) && data[p] >= '0' && data[p] <= '9' {
			v = v*10 + int64(data[p]-'0')
			p++
		}
		return v * sign
	}

	n := int(nextInt())
	k := nextInt()
	a := make([]int64, n)
	for i := 0; i < n; i++ {
		a[i] = nextInt()
	}

	countAllGE := func(x int64) int64 {
		var sum int64
		for _, ai := range a {
			sum += countGE(ai, x)
			if sum >= k {
				return sum
			}
		}
		return sum
	}

	lo := int64(-4000000000000000000)
	hi := int64(1000000000)

	for lo < hi {
		mid := lo + (hi-lo+1)/2
		if countAllGE(mid) >= k {
			lo = mid
		} else {
			hi = mid - 1
		}
	}

	t := lo
	b := make([]int64, n)
	var sum int64
	for i, ai := range a {
		b[i] = countGE(ai, t+1)
		sum += b[i]
	}

	need := k - sum
	for i, ai := range a {
		if need == 0 {
			break
		}
		if b[i] < ai && marginal(ai, b[i]+1) == t {
			b[i]++
			need--
		}
	}

	var out bytes.Buffer
	for i, v := range b {
		if i > 0 {
			out.WriteByte(' ')
		}
		out.WriteString(strconv.FormatInt(v, 10))
	}
	out.WriteByte('\n')

	w := bufio.NewWriterSize(os.Stdout, 1<<20)
	w.Write(out.Bytes())
	w.Flush()
}
```