← Home
For problem statement at 1000-1999/1500-1599/1550-1559/1555/problemE.txt this is a correct solution, but verifier at 1000-1999/1500-1599/1550-1559/1555/verifierE.go ends with case 1 failed: expected 1000000007 got 1073741824
exit status 1 can you fix the verifier? package main

import (
	"io"
	"os"
	"sort"
)

type Seg struct {
	l, r, w int
}

type SegTree struct {
	n  int
	mn []int
	lz []int
}

func NewSegTree(n int) *SegTree {
	if n < 0 {
		n = 0
	}
	size := n*4 + 5
	return &SegTree{
		n:  n,
		mn: make([]int, size),
		lz: make([]int, size),
	}
}

func (st *SegTree) Add(l, r, val int) {
	if st.n == 0 || l > r {
		return
	}
	st.add(1, 1, st.n, l, r, val)
}

func (st *SegTree) add(idx, l, r, ql, qr, val int) {
	if ql > r || qr < l {
		return
	}
	if ql <= l && r <= qr {
		st.mn[idx] += val
		st.lz[idx] += val
		return
	}
	mid := (l + r) >> 1
	left := idx << 1
	right := left | 1
	if st.lz[idx] != 0 {
		v := st.lz[idx]
		st.mn[left] += v
		st.lz[left] += v
		st.mn[right] += v
		st.lz[right] += v
		st.lz[idx] = 0
	}
	if ql <= mid {
		st.add(left, l, mid, ql, qr, val)
	}
	if qr > mid {
		st.add(right, mid+1, r, ql, qr, val)
	}
	if st.mn[left] < st.mn[right] {
		st.mn[idx] = st.mn[left]
	} else {
		st.mn[idx] = st.mn[right]
	}
}

func (st *SegTree) Min() int {
	if st.n == 0 {
		return 0
	}
	return st.mn[1]
}

func main() {
	data, _ := io.ReadAll(os.Stdin)
	pos := 0
	nextInt := func() int {
		sign := 1
		val := 0
		for pos < len(data) && (data[pos] < '0' || data[pos] > '9') && data[pos] != '-' {
			pos++
		}
		if pos < len(data) && data[pos] == '-' {
			sign = -1
			pos++
		}
		for pos < len(data) && data[pos] >= '0' && data[pos] <= '9' {
			val = val*10 + int(data[pos]-'0')
			pos++
		}
		return sign * val
	}

	n := nextInt()
	m := nextInt()
	segs := make([]Seg, n)
	for i := 0; i < n; i++ {
		l := nextInt()
		r := nextInt()
		w := nextInt()
		segs[i] = Seg{l: l, r: r, w: w}
	}
	sort.Slice(segs, func(i, j int) bool { return segs[i].w < segs[j].w })

	st := NewSegTree(m - 1)
	const INF = int(1 << 30)
	ans := INF
	L := 0
	for R := 0; R < n; R++ {
		st.Add(segs[R].l, segs[R].r-1, 1)
		for L <= R && st.Min() > 0 {
			diff := segs[R].w - segs[L].w
			if diff < ans {
				ans = diff
			}
			st.Add(segs[L].l, segs[L].r-1, -1)
			L++
		}
	}

	out := []byte{}
	out = appendInt(out, ans)
	out = append(out, '\n')
	os.Stdout.Write(out)
}

func appendInt(b []byte, v int) []byte {
	if v == 0 {
		return append(b, '0')
	}
	if v < 0 {
		b = append(b, '-')
		v = -v
	}
	var buf [20]byte
	i := len(buf)
	for v > 0 {
		i--
		buf[i] = byte('0' + v%10)
		v /= 10
	}
	return append(b, buf[i:]...)
}