package main import ( "bufio" "fmt" "os" "strconv" "strings" ) func mousetrap(scanner *bufio.Scanner) [][]int { caseCnt := ReadInt(scanner) answer := make([][]int, caseCnt) for i := 0; i < caseCnt; i++ { cardCnt := ReadInt(scanner) deck := make([]int, cardCnt) st := NewSegmentTree(cardCnt) for i, slot := 0, 0; st[1] != 0; i++ { slot = st.Search(slot, i+1) st.Update(slot, 0) deck[slot] = i + 1 } pos := ReadInts(scanner) answer[i] = make([]int, len(pos)-1) for j := 1; j < len(pos); j++ { answer[i][j-1] = deck[pos[j]-1] } } return answer } func main() { inputFiles := []string{"C-small-practice.in", "C-large-practice.in", "test.in"} outputFiles := []string{"result-small.out", "result-large.out", "test.out"} const ( small = iota large test ) fileType := test fin, _ := os.Open(inputFiles[fileType]) defer fin.Close() scanner := bufio.NewScanner(fin) answer := mousetrap(scanner) fout, _ := os.Create(outputFiles[fileType]) defer fout.Close() for i := range answer { var ans strings.Builder for _, n := range answer[i] { ans.WriteString(" " + strconv.Itoa(n)) } s := fmt.Sprintf("Case #%d:%s\n", i+1, ans.String()) fout.WriteString(s) } }