← Home
For problem statement at 0-999/700-799/720-729/720/problemA.txt this is a correct solution, but verifier at 0-999/700-799/720-729/720/verifierA.go ends with case 3 failed: expected NO got YES
input:
3 3
3 2 3 4
5 2 3 4 5 6
exit status 1 can you fix the verifier? ```go
package main

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

type SegTree struct {
	tree []int
	lazy []int
	size int
}

func newSegTree(data []int) *SegTree {
	n := len(data)
	st := &SegTree{
		tree: make([]int, 4*n),
		lazy: make([]int, 4*n),
		size: n,
	}
	st.build(data, 1, 0, n-1)
	return st
}

func (st *SegTree) build(data []int, node, start, end int) {
	if start == end {
		st.tree[node] = data[start]
		return
	}
	mid := (start + end) / 2
	st.build(data, 2*node, start, mid)
	st.build(data, 2*node+1, mid+1, end)
	st.tree[node] = min(st.tree[2*node], st.tree[2*node+1])
}

func (st *SegTree) push(node int) {
	if st.lazy[node] != 0 {
		st.tree[2*node] += st.lazy[node]
		st.lazy[2*node] += st.lazy[node]
		st.tree[2*node+1] += st.lazy[node]
		st.lazy[2*node+1] += st.lazy[node]
		st.lazy[node] = 0
	}
}

func (st *SegTree) addRange(l, r, val int) {
	st.update(1, 0, st.size-1, l, r, val)
}

func (st *SegTree) update(node, start, end, l, r, val int) {
	if l > end || r < start {
		return
	}
	if l <= start && end <= r {
		st.tree[node] += val
		st.lazy[node] += val
		return
	}
	st.push(node)
	mid := (start + end) / 2
	st.update(2*node, start, mid, l, r, val)
	st.update(2*node+1, mid+1, end, l, r, val)
	st.tree[node] = min(st.tree[2*node], st.tree[2*node+1])
}

func (st *SegTree) getMin() int {
	return st.tree[1]
}

func min(a, b int) int {
	if a < b {
		return a
	}
	return b
}

type seat struct {
	d1, d2 int
}

func main() {
	in := bufio.NewReader(os.Stdin)
	var n, m int
	fmt.Fscan(in, &n, &m)

	maxDist := n + m
	limit := maxDist + 2

	var k int
	fmt.Fscan(in, &k)
	p1Counts := make([]int, limit)
	for i := 0; i < k; i++ {
		var val int
		fmt.Fscan(in, &val)
		if val >= limit {
			val = limit - 1
		}
		p1Counts[val]++
	}

	var l int
	fmt.Fscan(in, &l)
	p2Counts := make([]int, limit)
	for i := 0; i < l; i++ {
		var val int
		fmt.Fscan(in, &val)
		if val >= limit {
			val = limit - 1
		}
		p2Counts[val]++
	}

	P1 := make([]int, limit)
	curr := 0
	for i := 0; i < limit; i++ {
		curr += p1Counts[i]
		P1[i] = curr
	}

	P2 := make([]int, limit)
	curr = 0
	for i := 0; i < limit; i++ {
		curr += p2Counts[i]
		P2[i] = curr
	}

	seats := make([]seat, 0, n*m)
	c2Counts := make([]int, limit)
	for r := 1; r <= n; r++ {
		for c := 1; c <= m; c++ {
			d1 := r + c
			d2 := r - c + m + 1
			seats = append(seats, seat{d1, d2})
			if d2 < limit {
				c2Counts[d2]++
			}
		}
	}

	C2 := make([]int, limit)
	curr = 0
	for i := 0; i < limit; i++ {
		curr += c2Counts[i]
		C2[i] = curr
	}

	initData := make([]int, limit)
	for i := 0; i < limit; i++ {
		initData[i] = C2[i] - P2[i]
	}
	st := newSegTree(initData)

	sort.Slice(seats, func(i, j int) bool {
		return seats[i].d1 < seats[j].d1
	})

	seatIdx := 0
	numSeats := len(seats)

	for s1 := 0; s1 < limit; s1++ {
		for seatIdx < numSeats && seats[seatIdx].d1 == s1 {
			d2 := seats[seatIdx].d2
			st.addRange(d2, limit-1, -1)
			seatIdx++
		}

		f := seatIdx - P1[s1]
		minG := st.getMin()

		if f+minG < 0 {
			fmt.Println("NO")
			return
		}
	}

	fmt.Println("YES")
}
```