← Home
For problem statement at 2000-2999/2000-2099/2000-2009/2005/problemE2.txt this is a correct solution, but verifier at 2000-2999/2000-2099/2000-2009/2005/verifierE2.go ends with All 16 tests passed can you fix the verifier? package main

import (
	"bufio"
	"os"
)

var (
	seen_gen   = make([]int, 3000005)
	mapped_val = make([]int, 3000005)
	last_pos   = make([]int, 1505*1505)
	a          = make([]int, 1505)
	maxC       = make([]int, 1505)
	newMaxC    = make([]int, 1505)
)

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

	scanInt := func() int {
		scanner.Scan()
		res := 0
		for _, b := range scanner.Bytes() {
			if b >= '0' && b <= '9' {
				res = res*10 + int(b-'0')
			}
		}
		return res
	}

	scanner.Scan()
	if err := scanner.Err(); err != nil || len(scanner.Bytes()) == 0 {
		return
	}
	t := 0
	for _, b := range scanner.Bytes() {
		if b >= '0' && b <= '9' {
			t = t*10 + int(b-'0')
		}
	}

	out := bufio.NewWriter(os.Stdout)
	defer out.Flush()

	gen := 0

	for tc := 0; tc < t; tc++ {
		l := scanInt()
		n := scanInt()
		m := scanInt()

		gen++
		unique_vals := 0

		for i := 0; i < l; i++ {
			a[i] = scanInt()
			if a[i] < len(seen_gen) && seen_gen[a[i]] != gen {
				seen_gen[a[i]] = gen
				mapped_val[a[i]] = unique_vals
				unique_vals++
			}
		}

		for id := 0; id < unique_vals; id++ {
			for r := 0; r <= n; r++ {
				last_pos[id*(n+1)+r] = 0
			}
		}

		for r := 1; r <= n; r++ {
			for c := 1; c <= m; c++ {
				x := scanInt()
				if x < len(seen_gen) && seen_gen[x] == gen {
					id := mapped_val[x]
					idx := id*(n+1) + r
					if c > last_pos[idx] {
						last_pos[idx] = c
					}
				}
			}
		}

		for r := 0; r <= n+1; r++ {
			maxC[r] = 0
		}

		for k := l - 1; k >= 0; k-- {
			v := a[k]
			id := mapped_val[v]

			for r := 0; r <= n+1; r++ {
				newMaxC[r] = 0
			}

			for r := 1; r <= n; r++ {
				c := last_pos[id*(n+1)+r]
				if c > 0 {
					if c >= maxC[r+1] {
						if c > newMaxC[r] {
							newMaxC[r] = c
						}
					}
				}
			}

			for r := n; r >= 1; r-- {
				if newMaxC[r+1] > newMaxC[r] {
					newMaxC[r] = newMaxC[r+1]
				}
			}

			for r := 1; r <= n+1; r++ {
				maxC[r] = newMaxC[r]
			}
		}

		if maxC[1] > 0 {
			out.WriteString("T\n")
		} else {
			out.WriteString("N\n")
		}
	}
}