← Home
```go
package main

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

func main() {
	reader := bufio.NewReader(os.Stdin)
	var n int
	fmt.Fscan(reader, &n)

	f := make([]int, n+1)
	received := make([]bool, n+1)
	var G []int

	for i := 1; i <= n; i++ {
		fmt.Fscan(reader, &f[i])
		if f[i] == 0 {
			G = append(G, i)
		} else {
			received[f[i]] = true
		}
	}

	isG := make([]bool, n+1)
	for _, g := range G {
		isG[g] = true
	}

	var A []int
	var B []int
	var C []int

	for i := 1; i <= n; i++ {
		if !received[i] {
			if isG[i] {
				A = append(A, i)
			} else {
				B = append(B, i)
			}
		}
	}

	for _, g := range G {
		if received[g] {
			C = append(C, g)
		}
	}

	if len(A) > 1 {
		for i := 0; i < len(A)-1; i++ {
			f[A[i]] = A[i+1]
		}
		f[A[len(A)-1]] = A[0]
		for i := 0; i < len(B); i++ {
			f[C[i]] = B[i]
		}
	} else if len(A) == 1 {
		f[A[0]] = B[0]
		f[C[0]] = A[0]
		for i := 1; i < len(B); i++ {
			f[C[i]] = B[i]
		}
	} else {
		for i := 0; i < len(B); i++ {
			f[C[i]] = B[i]
		}
	}

	out := bufio.NewWriter(os.Stdout)
	for i := 1; i <= n; i++ {
		fmt.Fprint(out, f[i])
		if i < n {
			fmt.Fprint(out, " ")
		}
	}
	fmt.Fprintln(out)
	out.Flush()
}
```