← Home
For problem statement at 1000-1999/1500-1599/1530-1539/1539/problemF.txt this is a correct solution, but verifier at 1000-1999/1500-1599/1530-1539/1539/verifierF.go ends with All 100 tests passed can you fix the verifier? package main

import (
	"bufio"
	"fmt"
	"os"
)

type FastScanner struct {
	r *bufio.Reader
}

func NewFastScanner() *FastScanner {
	return &FastScanner{r: bufio.NewReaderSize(os.Stdin, 1<<20)}
}

func (fs *FastScanner) NextInt() int {
	sign := 1
	val := 0
	b, _ := fs.r.ReadByte()
	for (b < '0' || b > '9') && b != '-' {
		b, _ = fs.r.ReadByte()
	}
	if b == '-' {
		sign = -1
		b, _ = fs.r.ReadByte()
	}
	for b >= '0' && b <= '9' {
		val = val*10 + int(b-'0')
		b2, err := fs.r.ReadByte()
		if err != nil {
			break
		}
		b = b2
	}
	return val * sign
}

func main() {
	in := NewFastScanner()
	out := bufio.NewWriterSize(os.Stdout, 1<<20)
	defer out.Flush()

	n := in.NextInt()
	a := make([]int, n)
	for i := 0; i < n; i++ {
		a[i] = in.NextInt()
	}

	leftLess := make([]int, n)
	rightLess := make([]int, n)
	leftGreater := make([]int, n)
	rightGreater := make([]int, n)

	stack := make([]int, 0, n)
	for i := 0; i < n; i++ {
		for len(stack) > 0 && a[stack[len(stack)-1]] >= a[i] {
			stack = stack[:len(stack)-1]
		}
		if len(stack) == 0 {
			leftLess[i] = -1
		} else {
			leftLess[i] = stack[len(stack)-1]
		}
		stack = append(stack, i)
	}

	stack = stack[:0]
	for i := n - 1; i >= 0; i-- {
		for len(stack) > 0 && a[stack[len(stack)-1]] >= a[i] {
			stack = stack[:len(stack)-1]
		}
		if len(stack) == 0 {
			rightLess[i] = n
		} else {
			rightLess[i] = stack[len(stack)-1]
		}
		stack = append(stack, i)
	}

	stack = stack[:0]
	for i := 0; i < n; i++ {
		for len(stack) > 0 && a[stack[len(stack)-1]] <= a[i] {
			stack = stack[:len(stack)-1]
		}
		if len(stack) == 0 {
			leftGreater[i] = -1
		} else {
			leftGreater[i] = stack[len(stack)-1]
		}
		stack = append(stack, i)
	}

	stack = stack[:0]
	for i := n - 1; i >= 0; i-- {
		for len(stack) > 0 && a[stack[len(stack)-1]] <= a[i] {
			stack = stack[:len(stack)-1]
		}
		if len(stack) == 0 {
			rightGreater[i] = n
		} else {
			rightGreater[i] = stack[len(stack)-1]
		}
		stack = append(stack, i)
	}

	ans := make([]int, n)
	for i := 0; i < n; i++ {
		lenGE := rightLess[i] - leftLess[i] - 1
		lenLE := rightGreater[i] - leftGreater[i] - 1
		ge := lenGE / 2
		le := (lenLE - 1) / 2
		if ge < le {
			ans[i] = le
		} else {
			ans[i] = ge
		}
	}

	for i := 0; i < n; i++ {
		if i > 0 {
			fmt.Fprint(out, " ")
		}
		fmt.Fprint(out, ans[i])
	}
}