← Home
For problem statement at 0-999/800-899/850-859/856/problemE.txt this is a correct solution, but verifier at 0-999/800-899/850-859/856/verifierE.go ends with case 6 failed: expected "YES\nNO" got "YES\nYES"
input:
1 10
1 6 9
1 10 6
2 1
1 4 9
1 5 6
1 2 9
3 3 5
2 3
3 2 4
2 4
exit status 1 can you fix the verifier? ```go
package main

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

func readInt(reader *bufio.Reader) int {
	var n int
	var sign int = 1
	for {
		b, err := reader.ReadByte()
		if err != nil {
			return 0
		}
		if b == '-' {
			sign = -1
			continue
		}
		if b >= '0' && b <= '9' {
			n = int(b - '0')
			break
		}
	}
	for {
		b, err := reader.ReadByte()
		if err != nil || b < '0' || b > '9' {
			return n * sign
		}
		n = n*10 + int(b-'0')
	}
}

type Event struct {
	typ int
	a, b int
	id   int
}

type Satellite struct {
	id   int
	x, y int64
}

type Node struct {
	top [3]int
	cnt int
}

var R int64
var sat []Satellite
var sortedSats []int
var leafIdx []int
var tree []Node

func uGreater(id1, id2 int) bool {
	p1 := (sat[id1].x + R) * sat[id2].y
	p2 := (sat[id2].x + R) * sat[id1].y
	return p1 > p2
}

func vGreater(id1, id2 int) bool {
	p1 := (sat[id1].x - R) * sat[id2].y
	p2 := (sat[id2].x - R) * sat[id1].y
	if p1 == p2 {
		return id1 > id2
	}
	return p1 > p2
}

func vGreaterEq(id1, id2 int) bool {
	p1 := (sat[id1].x - R) * sat[id2].y
	p2 := (sat[id2].x - R) * sat[id1].y
	return p1 >= p2
}

func validGeo(u_ref, v_ref int) bool {
	xu, yu := sat[u_ref].x, sat[u_ref].y
	xv, yv := sat[v_ref].x, sat[v_ref].y
	return (xu+R)*(xv-R) >= -yu*yv
}

func merge(a, b Node) Node {
	var res Node
	i, j := 0, 0
	for i < a.cnt && j < b.cnt && res.cnt < 3 {
		if vGreater(a.top[i], b.top[j]) {
			res.top[res.cnt] = a.top[i]
			res.cnt++
			i++
		} else {
			res.top[res.cnt] = b.top[j]
			res.cnt++
			j++
		}
	}
	for i < a.cnt && res.cnt < 3 {
		res.top[res.cnt] = a.top[i]
		res.cnt++
		i++
	}
	for j < b.cnt && res.cnt < 3 {
		res.top[res.cnt] = b.top[j]
		res.cnt++
		j++
	}
	return res
}

func update(node, l, r, idx, id, op int) {
	if l == r {
		if op == 1 {
			tree[node].top[0] = id
			tree[node].cnt = 1
		} else {
			tree[node].cnt = 0
		}
		return
	}
	mid := (l + r) / 2
	if idx <= mid {
		update(2*node, l, mid, idx, id, op)
	} else {
		update(2*node+1, mid+1, r, idx, id, op)
	}
	tree[node] = merge(tree[2*node], tree[2*node+1])
}

func queryTree(node, l, r, ql, qr int) Node {
	if ql <= l && r <= qr {
		return tree[node]
	}
	mid := (l + r) / 2
	if qr <= mid {
		return queryTree(2*node, l, mid, ql, qr)
	}
	if ql > mid {
		return queryTree(2*node+1, mid+1, r, ql, qr)
	}
	return merge(
		queryTree(2*node, l, mid, ql, qr),
		queryTree(2*node+1, mid+1, r, ql, qr),
	)
}

func findRightmostU(u_ref, K int) int {
	l, r_idx := 0, K-1
	ans := -1
	for l <= r_idx {
		mid := (l + r_idx) / 2
		id := sortedSats[mid]
		p1 := (sat[id].x + R) * sat[u_ref].y
		p2 := (sat[u_ref].x + R) * sat[id].y
		if p1 <= p2 {
			ans = mid
			l = mid + 1
		} else {
			r_idx = mid - 1
		}
	}
	return ans
}

func main() {
	reader := bufio.NewReaderSize(os.Stdin, 64*1024)
	writer := bufio.NewWriterSize(os.Stdout, 64*1024)
	defer writer.Flush()

	r_planet := readInt(reader)
	n := readInt(reader)
	R = int64(r_planet)

	events := make([]Event, n)
	K := 0
	curId := 0
	for i := 0; i < n; i++ {
		typ := readInt(reader)
		events[i].typ = typ
		if typ == 1 {
			events[i].a = readInt(reader)
			events[i].b = readInt(reader)
			curId++
			events[i].id = curId
			K++
		} else if typ == 2 {
			events[i].a = readInt(reader)
		} else {
			events[i].a = readInt(reader)
			events[i].b = readInt(reader)
		}
	}

	if K == 0 {
		return
	}

	sat = make([]Satellite, K+1)
	for i := 0; i < n; i++ {
		if events[i].typ == 1 {
			id := events[i].id
			sat[id] = Satellite{id: id, x: int64(events[i].a), y: int64(events[i].b)}
		}
	}

	sortedSats = make([]int, K)
	for i := 0; i < K; i++ {
		sortedSats[i] = i + 1
	}
	sort.Slice(sortedSats, func(i, j int) bool {
		id1, id2 := sortedSats[i], sortedSats[j]
		p1 := (sat[id1].x + R) * sat[id2].y
		p2 := (sat[id2].x + R) * sat[id1].y
		if p1 == p2 {
			return id1 < id2
		}
		return p1 < p2
	})

	leafIdx = make([]int, K+1)
	for i, id := range sortedSats {
		leafIdx[id] = i
	}

	tree = make([]Node, 4*K)

	for i := 0; i < n; i++ {
		ev := events[i]
		if ev.typ == 1 {
			id := ev.id
			idx := leafIdx[id]
			update(1, 0, K-1, idx, id, 1)
		} else if ev.typ == 2 {
			id := ev.a
			idx := leafIdx[id]
			update(1, 0, K-1, idx, id, 0)
		} else if ev.typ == 3 {
			i_id, j_id := ev.a, ev.b

			u_ref := i_id
			if uGreater(j_id, i_id) {
				u_ref = j_id
			}

			v_ref := i_id
			if vGreater(i_id, j_id) {
				v_ref = j_id
			}

			if !validGeo(u_ref, v_ref) {
				writer.WriteString("NO\n")
				continue
			}

			R_idx := findRightmostU(u_ref, K)
			if R_idx == -1 {
				writer.WriteString("NO\n")
				continue
			}

			res := queryTree(1, 0, K-1, 0, R_idx)

			interference := false
			for idx := 0; idx < res.cnt; idx++ {
				k := res.top[idx]
				if k == i_id || k == j_id {
					continue
				}
				if vGreaterEq(k, v_ref) {
					interference = true
					break
				}
			}

			if interference {
				writer.WriteString("NO\n")
			} else {
				writer.WriteString("YES\n")
			}
		}
	}
}
```