← Home
For problem statement at 0-999/0-99/80-89/87/problemE.txt this is a correct solution, but verifier at 0-999/0-99/80-89/87/verifierE.go ends with build oracle: exit status 1
stat /home/ubuntu/codeforces/0-999/0-99/80-89/87/0-999/0-99/80-89/87/87E.go: directory not found

exit status 1 can you fix the verifier? ```go
package main

import (
	"bufio"
	"io"
	"os"
)

type Point struct {
	x, y int64
}

type FastScanner struct {
	data []byte
	idx  int
}

func (fs *FastScanner) nextInt() int64 {
	n := len(fs.data)
	for fs.idx < n && fs.data[fs.idx] <= ' ' {
		fs.idx++
	}
	sign := int64(1)
	if fs.data[fs.idx] == '-' {
		sign = -1
		fs.idx++
	}
	var val int64
	for fs.idx < n {
		c := fs.data[fs.idx]
		if c < '0' || c > '9' {
			break
		}
		val = val*10 + int64(c-'0')
		fs.idx++
	}
	return sign * val
}

func add(a, b Point) Point {
	return Point{a.x + b.x, a.y + b.y}
}

func sub(a, b Point) Point {
	return Point{a.x - b.x, a.y - b.y}
}

func crossSignXY(ax, ay, bx, by int64) int {
	p1 := ax * by
	p2 := ay * bx
	if p1 >= 0 && p2 < 0 {
		return 1
	}
	if p1 < 0 && p2 >= 0 {
		return -1
	}
	if p1 > p2 {
		return 1
	}
	if p1 < p2 {
		return -1
	}
	return 0
}

func crossSign(a, b Point) int {
	return crossSignXY(a.x, a.y, b.x, b.y)
}

func orient(a, b, c Point) int {
	return crossSignXY(b.x-a.x, b.y-a.y, c.x-a.x, c.y-a.y)
}

func min64(a, b int64) int64 {
	if a < b {
		return a
	}
	return b
}

func max64(a, b int64) int64 {
	if a > b {
		return a
	}
	return b
}

func onSegment(a, b, p Point) bool {
	return orient(a, b, p) == 0 &&
		min64(a.x, b.x) <= p.x && p.x <= max64(a.x, b.x) &&
		min64(a.y, b.y) <= p.y && p.y <= max64(a.y, b.y)
}

func normalize(poly []Point) []Point {
	n := len(poly)
	idx := 0
	for i := 1; i < n; i++ {
		if poly[i].y < poly[idx].y || (poly[i].y == poly[idx].y && poly[i].x < poly[idx].x) {
			idx = i
		}
	}
	if idx == 0 {
		return poly
	}
	res := make([]Point, n)
	copy(res, poly[idx:])
	copy(res[n-idx:], poly[:idx])
	return res
}

func minkowski(a, b []Point) []Point {
	a = normalize(a)
	b = normalize(b)

	na, nb := len(a), len(b)
	ea := make([]Point, na)
	eb := make([]Point, nb)

	for i := 0; i < na; i++ {
		ea[i] = sub(a[(i+1)%na], a[i])
	}
	for i := 0; i < nb; i++ {
		eb[i] = sub(b[(i+1)%nb], b[i])
	}

	res := make([]Point, 0, na+nb)
	cur := add(a[0], b[0])
	res = append(res, cur)

	i, j := 0, 0
	for i < na || j < nb {
		if i == na {
			cur = add(cur, eb[j])
			j++
		} else if j == nb {
			cur = add(cur, ea[i])
			i++
		} else {
			s := crossSign(ea[i], eb[j])
			if s > 0 {
				cur = add(cur, ea[i])
				i++
			} else if s < 0 {
				cur = add(cur, eb[j])
				j++
			} else {
				cur = add(cur, add(ea[i], eb[j]))
				i++
				j++
			}
		}
		res = append(res, cur)
	}

	return normalize(res[:len(res)-1])
}

func containsConvex(poly []Point, q Point) bool {
	n := len(poly)
	if n == 1 {
		return poly[0] == q
	}
	if n == 2 {
		return onSegment(poly[0], poly[1], q)
	}

	s1 := orient(poly[0], poly[1], q)
	if s1 < 0 {
		return false
	}
	s2 := orient(poly[0], poly[n-1], q)
	if s2 > 0 {
		return false
	}
	if s1 == 0 {
		return onSegment(poly[0], poly[1], q)
	}
	if s2 == 0 {
		return onSegment(poly[0], poly[n-1], q)
	}

	l, r := 1, n-1
	for r-l > 1 {
		m := (l + r) >> 1
		if orient(poly[0], poly[m], q) >= 0 {
			l = m
		} else {
			r = m
		}
	}

	return orient(poly[l], poly[l+1], q) >= 0
}

func main() {
	data, _ := io.ReadAll(os.Stdin)
	fs := FastScanner{data: data}

	polys := make([][]Point, 3)
	for k := 0; k < 3; k++ {
		n := int(fs.nextInt())
		poly := make([]Point, n)
		for i := 0; i < n; i++ {
			poly[i] = Point{fs.nextInt(), fs.nextInt()}
		}
		polys[k] = poly
	}

	sum := minkowski(minkowski(polys[0], polys[1]), polys[2])

	m := int(fs.nextInt())
	out := bufio.NewWriterSize(os.Stdout, 1<<20)
	for i := 0; i < m; i++ {
		q := Point{fs.nextInt() * 3, fs.nextInt() * 3}
		if containsConvex(sum, q) {
			out.WriteString("YES\n")
		} else {
			out.WriteString("NO\n")
		}
	}
	out.Flush()
}
```