← Home
For problem statement at 1000-1999/1100-1199/1180-1189/1184/problemC2.txt this is a correct solution, but verifier at 1000-1999/1100-1199/1180-1189/1184/verifierC2.go ends with All 80 tests passed can you fix the verifier?  package main

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

type Point struct {
	u, v int
}

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

func NewSegTree(n int) *SegTree {
	return &SegTree{
		n:    n,
		tree: make([]int, 4*n),
		lazy: make([]int, 4*n),
	}
}

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

func (s *SegTree) pull(node int) {
	if s.tree[node*2] > s.tree[node*2+1] {
		s.tree[node] = s.tree[node*2]
	} else {
		s.tree[node] = s.tree[node*2+1]
	}
}

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

func main() {
	reader := bufio.NewReader(os.Stdin)
	writer := bufio.NewWriter(os.Stdout)
	defer writer.Flush()

	var n, r int
	fmt.Fscan(reader, &n, &r)

	points := make([]Point, n)
	vs := make([]int, n)

	for i := 0; i < n; i++ {
		var x, y int
		fmt.Fscan(reader, &x, &y)
		u := x + y
		v := x - y
		points[i] = Point{u, v}
		vs[i] = v
	}

	sort.Ints(vs)
	m := 0
	for i := 0; i < n; i++ {
		if i == 0 || vs[i] != vs[i-1] {
			vs[m] = vs[i]
			m++
		}
	}
	vs = vs[:m]

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

	rIdx := make([]int, m)
	limit := 2 * r
	for i := 0; i < m; i++ {
		target := vs[i] + limit
		idx := sort.Search(m, func(j int) bool { return vs[j] > target })
		rIdx[i] = idx - 1
	}

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

	st := NewSegTree(m)
	ans := 0
	left := 0

	for right := 0; right < n; right++ {
		idx := comp[points[right].v]
		l := sort.Search(m, func(i int) bool { return rIdx[i] >= idx })
		st.update(1, 0, m-1, l, idx, 1)

		for points[right].u-points[left].u > limit {
			idxLeft := comp[points[left].v]
			lLeft := sort.Search(m, func(i int) bool { return rIdx[i] >= idxLeft })
			st.update(1, 0, m-1, lLeft, idxLeft, -1)
			left++
		}

		if st.tree[1] > ans {
			ans = st.tree[1]
		}
	}

	fmt.Fprintln(writer, ans)
}