← Home
For problem statement at 1000-1999/1400-1499/1450-1459/1458/problemE.txt this is a correct solution, but verifier at 1000-1999/1400-1499/1450-1459/1458/verifierE.go ends with all tests passed can you fix the verifier? package main

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

type Point struct {
	x, y int
}

const MAX_VAL = 2000000005

type Node struct {
	count int
	left  int32
	right int32
	zero  bool
}

var tree []Node

func pushDown(u int32, L, R int) {
	mid := L + (R - L) / 2
	if tree[u].left == 0 {
		tree = append(tree, Node{count: mid - L + 1})
		tree[u].left = int32(len(tree) - 1)
	}
	if tree[u].right == 0 {
		tree = append(tree, Node{count: R - mid})
		tree[u].right = int32(len(tree) - 1)
	}
	if tree[u].zero {
		l := tree[u].left
		r := tree[u].right
		tree[l].count = 0
		tree[l].zero = true
		tree[r].count = 0
		tree[r].zero = true
		tree[u].zero = false
	}
}

func removeFirstK(u int32, k int, L, R int) int {
	if tree[u].count == 0 || k == 0 {
		return k
	}
	if tree[u].count <= k {
		removed := tree[u].count
		tree[u].count = 0
		tree[u].zero = true
		return k - removed
	}
	if L == R {
		tree[u].count -= k
		if tree[u].count == 0 {
			tree[u].zero = true
		}
		return 0
	}
	pushDown(u, L, R)
	mid := L + (R - L) / 2
	k = removeFirstK(tree[u].left, k, L, mid)
	if k > 0 {
		k = removeFirstK(tree[u].right, k, mid+1, R)
	}
	tree[u].count = tree[tree[u].left].count + tree[tree[u].right].count
	return k
}

func removeElement(u int32, y int, L, R int) {
	if tree[u].count == 0 {
		return
	}
	if L == R {
		tree[u].count = 0
		tree[u].zero = true
		return
	}
	pushDown(u, L, R)
	mid := L + (R - L) / 2
	if y <= mid {
		removeElement(tree[u].left, y, L, mid)
	} else {
		removeElement(tree[u].right, y, mid+1, R)
	}
	tree[u].count = tree[tree[u].left].count + tree[tree[u].right].count
}

func getMin(u int32, L, R int) int {
	if tree[u].count == 0 {
		return -1
	}
	if L == R {
		return L
	}
	pushDown(u, L, R)
	mid := L + (R - L) / 2
	if tree[tree[u].left].count > 0 {
		return getMin(tree[u].left, L, mid)
	}
	return getMin(tree[u].right, mid+1, R)
}

var buf []byte
var bufIdx int

func nextInt() int {
	for bufIdx < len(buf) && buf[bufIdx] <= 32 {
		bufIdx++
	}
	if bufIdx >= len(buf) {
		return 0
	}
	res := 0
	for bufIdx < len(buf) && buf[bufIdx] > 32 {
		res = res*10 + int(buf[bufIdx]-'0')
		bufIdx++
	}
	return res
}

func main() {
	content, _ := io.ReadAll(os.Stdin)
	buf = content

	n := nextInt()
	m := nextInt()

	if n == 0 && m == 0 {
		return
	}

	shortcutsMap := make(map[Point]bool, n)
	Sx := make(map[int][]int)
	interesting := make([]int, 0, n+m)

	for i := 0; i < n; i++ {
		x := nextInt()
		y := nextInt()
		shortcutsMap[Point{x, y}] = true
		Sx[x] = append(Sx[x], y)
		interesting = append(interesting, x)
	}

	type Query struct {
		x, y int
	}
	queries := make([]Query, m)
	for i := 0; i < m; i++ {
		queries[i].x = nextInt()
		queries[i].y = nextInt()
		interesting = append(interesting, queries[i].x)
	}

	sort.Ints(interesting)
	uniqueInteresting := make([]int, 0, len(interesting))
	for i, x := range interesting {
		if i == 0 || x != interesting[i-1] {
			uniqueInteresting = append(uniqueInteresting, x)
		}
	}

	tree = make([]Node, 1, 8000000)
	tree = append(tree, Node{count: MAX_VAL + 1})

	Y := make(map[int]int, len(uniqueInteresting))
	current_x := 0

	for _, x := range uniqueInteresting {
		gap := x - current_x
		if gap > 0 {
			removeFirstK(1, gap, 0, MAX_VAL)
		}
		current_x = x

		y_star := getMin(1, 0, MAX_VAL)

		listS := Sx[x]
		m_val := MAX_VAL + 10
		for _, y := range listS {
			if y < m_val {
				m_val = y
			}
		}

		if y_star < m_val {
			Y[x] = y_star
			removeElement(1, y_star, 0, MAX_VAL)
		} else {
			Y[x] = -1
		}

		for _, y := range listS {
			if y <= MAX_VAL {
				removeElement(1, y, 0, MAX_VAL)
			}
		}

		current_x = x + 1
	}

	writer := bufio.NewWriterSize(os.Stdout, 1<<20)
	for _, q := range queries {
		if shortcutsMap[Point{q.x, q.y}] {
			writer.WriteString("LOSE\n")
		} else if Y[q.x] == q.y {
			writer.WriteString("LOSE\n")
		} else {
			writer.WriteString("WIN\n")
		}
	}
	writer.Flush()
}