← Home
```go
package main

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

type FastScanner struct {
	r *bufio.Reader
	b []byte
}

func NewFastScanner() *FastScanner {
	return &FastScanner{
		r: bufio.NewReaderSize(os.Stdin, 1<<20),
		b: make([]byte, 0, 64),
	}
}

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

type BIT struct {
	n int
	f []int
}

func NewBIT(n int) *BIT {
	return &BIT{n: n, f: make([]int, n+2)}
}

func (b *BIT) Reset() {
	for i := range b.f {
		b.f[i] = 0
	}
}

func (b *BIT) Update(i, v int) {
	for i <= b.n {
		if v > b.f[i] {
			b.f[i] = v
		}
		i += i & -i
	}
}

func (b *BIT) Query(i int) int {
	res := 0
	for i > 0 {
		if b.f[i] > res {
			res = b.f[i]
		}
		i -= i & -i
	}
	return res
}

func reverse(a []int) {
	for i, j := 0, len(a)-1; i < j; i, j = i+1, j-1 {
		a[i], a[j] = a[j], a[i]
	}
}

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

	t := in.NextInt()
	totalN := 0
	ns := make([]int, t)
	as := make([][]int, t)
	maxA := 0
	for tc := 0; tc < t; tc++ {
		n := in.NextInt()
		ns[tc] = n
		totalN += n
		a := make([]int, n+1)
		for i := 1; i <= n; i++ {
			a[i] = in.NextInt()
			if a[i] > maxA {
				maxA = a[i]
			}
		}
		as[tc] = a
	}

	bit := NewBIT(maxA + 2)

	for tc := 0; tc < t; tc++ {
		n := ns[tc]
		a := as[tc]
		f := make([]int, n+1)
		g := make([]int, n+1)

		bit.Reset()
		for i := 1; i <= n; i++ {
			ai := a[i]
			bestSmaller := bit.Query(ai - 1)
			if bestSmaller < ai {
				bestSmaller = ai
			}
			f[i] = bestSmaller
			bit.Update(ai, f[i])
		}

		bit.Reset()
		for i := n; i >= 1; i-- {
			ai := a[i]
			bestSmaller := bit.Query(ai - 1)
			if bestSmaller < ai {
				bestSmaller = ai
			}
			g[i] = bestSmaller
			bit.Update(ai, g[i])
		}

		ans := make([]int, n+1)
		for i := 1; i <= n; i++ {
			if f[i] > g[i] {
				ans[i] = f[i]
			} else {
				ans[i] = g[i]
			}
		}

		for i := 1; i <= n; i++ {
			if i > 1 {
				fmt.Fprint(out, " ")
			}
			fmt.Fprint(out, ans[i])
		}
		if tc+1 < t {
			fmt.Fprintln(out)
		}
	}
}
```