← Home
For problem statement at 1000-1999/1700-1799/1710-1719/1710/problemB.txt this is a correct solution, but verifier at 1000-1999/1700-1799/1710-1719/1710/verifierB.go ends with All tests passed can you fix the verifier? ```go
package main

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

func scanInt(scanner *bufio.Scanner) int {
	scanner.Scan()
	b := scanner.Bytes()
	res := 0
	for _, v := range b {
		res = res*10 + int(v-'0')
	}
	return res
}

func scanInt64(scanner *bufio.Scanner) int64 {
	scanner.Scan()
	b := scanner.Bytes()
	var res int64
	for _, v := range b {
		res = res*10 + int64(v-'0')
	}
	return res
}

type Event struct {
	x    int64
	diff int64
}

func main() {
	scanner := bufio.NewScanner(os.Stdin)
	scanner.Split(bufio.ScanWords)

	writer := bufio.NewWriter(os.Stdout)
	defer writer.Flush()

	if !scanner.Scan() {
		return
	}
	t := 0
	for _, v := range scanner.Bytes() {
		t = t*10 + int(v-'0')
	}

	for tc := 0; tc < t; tc++ {
		n := scanInt(scanner)
		m := scanInt64(scanner)

		x := make([]int64, n)
		p := make([]int64, n)
		events := make([]Event, 0, 3*n)

		for i := 0; i < n; i++ {
			x[i] = scanInt64(scanner)
			p[i] = scanInt64(scanner)
			events = append(events, Event{x[i] - p[i], 1})
			events = append(events, Event{x[i], -2})
			events = append(events, Event{x[i] + p[i], 1})
		}

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

		compacted := make([]Event, 0, len(events))
		for i := 0; i < len(events); {
			j := i
			sum := int64(0)
			for j < len(events) && events[j].x == events[i].x {
				sum += events[j].diff
				j++
			}
			compacted = append(compacted, Event{events[i].x, sum})
			i = j
		}

		S_arr := make([]int64, len(compacted))
		var slope int64 = 0
		var S int64 = 0
		last_x := compacted[0].x

		for i, ev := range compacted {
			S += slope * (ev.x - last_x)
			last_x = ev.x
			S_arr[i] = S
			slope += ev.diff
		}

		hasFlood := false
		var M1 int64 = -3000000000000000000
		var M2 int64 = -3000000000000000000

		for i := 0; i < n; i++ {
			left, right := 0, len(compacted)-1
			idx := -1
			for left <= right {
				mid := (left + right) / 2
				if compacted[mid].x == x[i] {
					idx = mid
					break
				} else if compacted[mid].x < x[i] {
					left = mid + 1
				} else {
					right = mid - 1
				}
			}

			Sx := S_arr[idx]
			if Sx > m {
				hasFlood = true
				if Sx-x[i] > M1 {
					M1 = Sx - x[i]
				}
				if Sx+x[i] > M2 {
					M2 = Sx + x[i]
				}
			}
		}

		res := make([]byte, n)
		for i := 0; i < n; i++ {
			if !hasFlood {
				res[i] = '1'
			} else {
				if p[i]-x[i] >= M1-m && p[i]+x[i] >= M2-m {
					res[i] = '1'
				} else {
					res[i] = '0'
				}
			}
		}
		fmt.Fprintln(writer, string(res))
	}
}
```