Use this to learn the idea, then write your own version.
1package main2 3import (4 "bufio"5 . "fmt"6 "io"7)8 910func CF1463E(_r io.Reader, _w io.Writer) {11 in := bufio.NewReader(_r)12 out := bufio.NewWriter(_w)13 defer out.Flush()14 15 var n, k, v, w int16 Fscan(in, &n, &k)17 fa := make([]int, n)18 var find func(int) int19 find = func(x int) int {20 if fa[x] != x {21 fa[x] = find(fa[x])22 }23 return fa[x]24 }25 merge := func(from, to int) bool {26 x, y := find(from), find(to)27 if x == y {28 return false29 }30 fa[x] = y31 return true32 }33 same := func(x, y int) bool { return find(x) == find(y) }34 p := make([]int, n)35 to := make([]int, n)36 for i := range p {37 Fscan(in, &p[i])38 p[i]--39 to[i] = -140 fa[i] = i41 }42 for ; k > 0; k-- {43 Fscan(in, &v, &w)44 v--45 w--46 if !merge(w, v) {47 Fprint(out, 0)48 return49 }50 to[v] = w51 }52 53 54 g := make([][]int, n)55 deg := make([]int, n)56 for w, v := range p {57 if v >= 0 && !same(v, w) {58 v, w = fa[v], fa[w]59 g[v] = append(g[v], w)60 deg[w]++61 }62 }63 64 65 q := []int{}66 for i, d := range deg {67 if d == 0 && fa[i] == i {68 q = append(q, i)69 }70 }71 orders := []int{}72 for len(q) > 0 {73 v := q[0]74 q = q[1:]75 for x := v; x >= 0; x = to[x] {76 orders = append(orders, x)77 }78 for _, w := range g[v] {79 if deg[w]--; deg[w] == 0 {80 q = append(q, w)81 }82 }83 }84 85 if len(orders) < n {86 Fprint(out, 0)87 return88 }89 pos := make([]int, n)90 for i, o := range orders {91 pos[o] = i92 }93 94 95 for w, v := range p {96 if v >= 0 && pos[v] > pos[w] {97 Fprint(out, 0)98 return99 }100 }101 for _, v := range orders {102 Fprint(out, v+1, " ")103 }104}105 106func CF1463ESolution2(_r io.Reader, _w io.Writer) {107 in := bufio.NewReader(_r)108 out := bufio.NewWriter(_w)109 defer out.Flush()110 111 var n, k, v, w, rt int112 Fscan(in, &n, &k)113 p := make([]int, n)114 to := make([]int, n)115 top := make([]int, n)116 for i := range p {117 Fscan(in, &p[i])118 if p[i]--; p[i] < 0 {119 rt = i120 }121 to[i] = -1122 top[i] = i123 }124 inChain := make([]bool, n)125 for ; k > 0; k-- {126 Fscan(in, &v, &w)127 v--128 w--129 to[v] = w130 inChain[w] = true131 }132 133 g := make([][]int, n)134 deg := make([]int, n)135 for i, c := range inChain {136 if !c {137 for v := i; v >= 0; v = to[v] {138 top[v] = i139 if p[v] >= 0 && top[p[v]] != i {140 g[p[v]] = append(g[p[v]], i)141 deg[i]++142 }143 }144 }145 }146 147 ans := []interface{}{}148 q := []int{}149 150 151 152 153 if !inChain[rt] && deg[rt] == 0 {154 q = []int{rt}155 }156 for len(q) > 0 {157 for v, q = q[0], q[1:]; v >= 0; v = to[v] {158 ans = append(ans, v+1)159 for _, w := range g[v] {160 if deg[w]--; deg[w] == 0 {161 q = append(q, w)162 }163 }164 }165 }166 if len(ans) < n {167 Fprint(out, 0)168 } else {169 Fprint(out, ans...)170 }171}172 173174