← Home
```go
package main

import (
	"bufio"
	"os"
)

var in = bufio.NewReader(os.Stdin)
var out = bufio.NewWriter(os.Stdout)

func nextInt() int {
	res := 0
	sign := 1
	b, err := in.ReadByte()
	for err == nil && (b < '0' || b > '9') && b != '-' {
		b, err = in.ReadByte()
	}
	if err != nil {
		return 0
	}
	if b == '-' {
		sign = -1
		b, err = in.ReadByte()
	}
	for err == nil && b >= '0' && b <= '9' {
		res = res*10 + int(b-'0')
		b, err = in.ReadByte()
	}
	return res * sign
}

func main() {
	defer out.Flush()
	t := nextInt()
	levels := make([][]int, 30)
	for tc := 0; tc < t; tc++ {
		n := nextInt()
		for i := 0; i < 30; i++ {
			levels[i] = levels[i][:0]
		}
		maxLevel := 0
		pos := -1
		for i := 1; i <= n; i++ {
			val := nextInt()
			if val == -1 {
				pos = i
			} else {
				levels[val] = append(levels[val], i)
				if val > maxLevel {
					maxLevel = val
				}
			}
		}

		p := make([]int, n+1)
		low := 1
		high := n

		for k := 1; k <= maxLevel; k++ {
			if len(levels[k]) == 0 {
				continue
			}

			if k%2 == 1 {
				for _, idx := range levels[k] {
					if idx < pos {
						p[idx] = high
						high--
					}
				}
				for i := len(levels[k]) - 1; i >= 0; i-- {
					idx := levels[k][i]
					if idx > pos {
						p[idx] = high
						high--
					}
				}
			} else {
				for _, idx := range levels[k] {
					if idx < pos {
						p[idx] = low
						low++
					}
				}
				for i := len(levels[k]) - 1; i >= 0; i-- {
					idx := levels[k][i]
					if idx > pos {
						p[idx] = low
						low++
					}
				}
			}
		}
		p[pos] = low

		for i := 1; i <= n; i++ {
			val := p[i]
			var buf [12]byte
			idxBuf := 12
			for val > 0 {
				idxBuf--
				buf[idxBuf] = byte('0' + val%10)
				val /= 10
			}
			out.Write(buf[idxBuf:])
			if i < n {
				out.WriteByte(' ')
			} else {
				out.WriteByte('\n')
			}
		}
	}
}
```