← Home
package main

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

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

	if !scanner.Scan() {
		return
	}
	n := 0
	for _, b := range scanner.Bytes() {
		n = n*10 + int(b-'0')
	}

	a := make([]int, n)
	for i := 0; i < n; i++ {
		scanner.Scan()
		val := 0
		for _, b := range scanner.Bytes() {
			val = val*10 + int(b-'0')
		}
		a[i] = val
	}

	L := make([]int, n)
	R := make([]int, n)
	for i := 0; i < n; i++ {
		L[i] = -1
		R[i] = 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 {
			L[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 {
			R[i] = stack[len(stack)-1]
		}
		stack = append(stack, i)
	}

	ans := make([]int, n+2)
	for i := 0; i < n; i++ {
		length := R[i] - L[i] - 1
		if a[i] > ans[length] {
			ans[length] = a[i]
		}
	}

	for i := n; i >= 1; i-- {
		if ans[i+1] > ans[i] {
			ans[i] = ans[i+1]
		}
	}

	out := bufio.NewWriter(os.Stdout)
	defer out.Flush()
	for i := 1; i <= n; i++ {
		if i > 1 {
			out.WriteByte(' ')
		}
		fmt.Fprint(out, ans[i])
	}
	out.WriteByte('\n')
}