← Home
For problem statement at 0-999/400-499/480-489/487/problemD.txt this is a correct solution, but verifier at 0-999/400-499/480-489/487/verifierD.go ends with case 1 failed: expected:
0 1
0 1
got:
0 1
-1 -1
input:
1 4 4
^^<<
C 1 3 <
A 1 1
C 1 2 >
A 1 4
exit status 1 can you fix the verifier? package main

import (
	"bufio"
	"os"
	"strconv"
	"strings"
)

type Pair struct {
	r, c int
}

func main() {
	scanner := bufio.NewScanner(os.Stdin)
	scanner.Split(bufio.ScanWords)
	scanner.Buffer(make([]byte, 1024*1024), 1024*1024)

	scanInt := func() int {
		scanner.Scan()
		n, _ := strconv.Atoi(scanner.Text())
		return n
	}

	scanString := func() string {
		scanner.Scan()
		return scanner.Text()
	}

	n := scanInt()
	m := scanInt()
	q := scanInt()

	grid := make([][]byte, n+1)
	for i := 1; i <= n; i++ {
		grid[i] = make([]byte, m+2)
		s := scanString()
		for j := 1; j <= m; j++ {
			grid[i][j] = s[j-1]
		}
	}

	dest := make([][]Pair, n+1)
	for i := 1; i <= n; i++ {
		dest[i] = make([]Pair, m+2)
	}

	B := 250
	numBlocks := (n + B - 1) / B
	L := make([]int, numBlocks)
	R := make([]int, numBlocks)
	for k := 0; k < numBlocks; k++ {
		L[k] = k*B + 1
		R[k] = (k + 1) * B
		if R[k] > n {
			R[k] = n
		}
	}

	block_dest := make([][]Pair, numBlocks)
	for k := 0; k < numBlocks; k++ {
		block_dest[k] = make([]Pair, m+2)
	}

	computeDest := func(i int) {
		for y := 1; y <= m; y++ {
			curY := y
			vis := 0
			for {
				if curY == 0 || curY == m+1 {
					dest[i][y] = Pair{i, curY}
					break
				}
				if vis&(1<<curY) != 0 {
					dest[i][y] = Pair{-1, -1}
					break
				}
				vis |= (1 << curY)
				if grid[i][curY] == '^' {
					dest[i][y] = Pair{i - 1, curY}
					break
				} else if grid[i][curY] == '<' {
					curY--
				} else {
					curY++
				}
			}
		}
	}

	computeBlock := func(k int) {
		for y := 1; y <= m; y++ {
			curX := R[k]
			curY := y
			for curX >= L[k] {
				d := dest[curX][curY]
				if d.r == -1 {
					curX, curY = -1, -1
					break
				}
				if d.c == 0 || d.c == m+1 {
					curX, curY = d.r, d.c
					break
				}
				curX = d.r
				curY = d.c
			}
			block_dest[k][y] = Pair{curX, curY}
		}
	}

	for i := 1; i <= n; i++ {
		computeDest(i)
	}
	for k := 0; k < numBlocks; k++ {
		computeBlock(k)
	}

	var out strings.Builder
	out.Grow(q * 15)

	for i := 0; i < q; i++ {
		typ := scanString()
		if typ == "A" {
			x := scanInt()
			y := scanInt()
			curX, curY := x, y
			for curX > 0 {
				k := (curX - 1) / B
				if curX == R[k] {
					d := block_dest[k][curY]
					curX, curY = d.r, d.c
					if curX == -1 || curY == 0 || curY == m+1 {
						break
					}
				} else {
					d := dest[curX][curY]
					curX, curY = d.r, d.c
					if curX == -1 || curY == 0 || curY == m+1 {
						break
					}
				}
			}
			out.WriteString(strconv.Itoa(curX))
			out.WriteByte(' ')
			out.WriteString(strconv.Itoa(curY))
			out.WriteByte('\n')
		} else if typ == "C" {
			x := scanInt()
			y := scanInt()
			c := scanString()
			grid[x][y] = c[0]
			computeDest(x)
			computeBlock((x - 1) / B)
		}
	}
	os.Stdout.WriteString(out.String())
}