← Home
package main

import (
	"bufio"
	"fmt"
	"os"
	"sort"
	"strconv"
)

type Participant struct {
	name  string
	score int
}

func main() {
	scanner := bufio.NewScanner(os.Stdin)
	scanner.Split(bufio.ScanWords)

	if !scanner.Scan() {
		return
	}
	n, _ := strconv.Atoi(scanner.Text())
	scanner.Scan()
	m, _ := strconv.Atoi(scanner.Text())

	regions := make([][]Participant, m+1)
	for i := 0; i < n; i++ {
		scanner.Scan()
		name := scanner.Text()
		scanner.Scan()
		region, _ := strconv.Atoi(scanner.Text())
		scanner.Scan()
		score, _ := strconv.Atoi(scanner.Text())

		regions[region] = append(regions[region], Participant{name, score})
	}

	out := bufio.NewWriter(os.Stdout)
	for i := 1; i <= m; i++ {
		sort.Slice(regions[i], func(a, b int) bool {
			return regions[i][a].score > regions[i][b].score
		})

		if len(regions[i]) > 2 && regions[i][1].score == regions[i][2].score {
			fmt.Fprintln(out, "?")
		} else {
			fmt.Fprintln(out, regions[i][0].name, regions[i][1].name)
		}
	}
	out.Flush()
}