← Home
```go
package main

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

// FastScanner handles input parsing
type FastScanner struct {
	r *bufio.Reader
}

func NewFastScanner(r io.Reader) *FastScanner {
	return &FastScanner{r: bufio.NewReaderSize(r, 1<<20)}
}

func (s *FastScanner) ReadInt() int {
	var v int
	var c byte
	var err error
	for {
		c, err = s.r.ReadByte()
		if err != nil {
			return 0
		}
		if c > ' ' {
			break
		}
	}
	v = int(c - '0')
	for {
		c, err = s.r.ReadByte()
		if err != nil {
			break
		}
		if c <= ' ' {
			break
		}
		v = v*10 + int(c-'0')
	}
	return v
}

// Data structures for sorting
type item struct {
	id  int
	val float64
}

type Items []item

func (a Items) Len() int           { return len(a) }
func (a Items) Swap(i, j int)      { a[i], a[j] = a[j], a[i] }
func (a Items) Less(i, j int) bool { return a[i].val > a[j].val } // Descending

type sumItem struct {
	id  int
	sum int
}

type SumItems []sumItem

func (a SumItems) Len() int           { return len(a) }
func (a SumItems) Swap(i, j int)      { a[i], a[j] = a[j], a[i] }
func (a SumItems) Less(i, j int) bool { return a[i].sum > a[j].sum } // Descending

func main() {
	scanner := NewFastScanner(os.Stdin)
	writer := bufio.NewWriter(os.Stdout)
	defer writer.Flush()

	n := scanner.ReadInt()

	const maxM = 200005
	reqs := make([][]int, maxM)
	var activeMsgs []int
	seen := make([]bool, maxM)

	for i := 0; i < n; i++ {
		m := scanner.ReadInt()
		k := scanner.ReadInt()
		reqs[m] = append(reqs[m], k)
		if !seen[m] {
			seen[m] = true
			activeMsgs = append(activeMsgs, m)
		}
	}

	numActive := len(activeMsgs)
	bestT := 1
	maxExpected := -1.0

	// Strategy 1: Small t (1 to 19)
	limitSmall := 19
	if numActive < 19 {
		limitSmall = numActive
	}

	items := make(Items, numActive)

	for t := 1; t <= limitSmall; t++ {
		// Calculate weights for each message for current t
		for i, mid := range activeMsgs {
			w := 0.0
			for _, k := range reqs[mid] {
				if t <= k {
					w += 1.0
				} else {
					w += float64(k) / float64(t)
				}
			}
			items[i] = item{id: mid, val: w}
		}

		// Sort to find best t messages
		sort.Sort(items)

		currentSum := 0.0
		for i := 0; i < t; i++ {
			currentSum += items[i].val
		}

		if currentSum > maxExpected {
			maxExpected = currentSum
			bestT = t
		}
	}

	// Strategy 2: Large t (20 to numActive)
	if numActive >= 20 {
		sums := make(SumItems, numActive)
		for i, mid := range activeMsgs {
			s := 0
			for _, k := range reqs[mid] {
				s += k
			}
			sums[i] = sumItem{id: mid, sum: s}
		}

		sort.Sort(sums)

		currentTotalK := 0
		for i := 0; i < numActive; i++ {
			currentTotalK += sums[i].sum
			t := i + 1
			if t >= 20 {
				expected := float64(currentTotalK) / float64(t)
				if expected > maxExpected {
					maxExpected = expected
					bestT = t
				}
			}
		}
	}

	// Output result
	fmt.Fprintln(writer, bestT)

	// Reconstruct the set of messages for bestT
	resIds := make([]int, 0, bestT)
	
	if bestT < 20 {
		// Recalculate weights for bestT
		for i, mid := range activeMsgs {
			w := 0.0
			for _, k := range reqs[mid] {
				if bestT <= k {
					w += 1.0
				} else {
					w += float64(k) / float64(bestT)
				}
			}
			items[i] = item{id: mid, val: w}
		}
		sort.Sort(items)
		for i := 0; i < bestT; i++ {
			resIds = append(resIds, items[i].id)
		}
	} else {
		// Recalculate based on sum K
		sums := make(SumItems, numActive)
		for i, mid := range activeMsgs {
			s := 0
			for _, k := range reqs[mid] {
				s += k
			}
			sums[i] = sumItem{id: mid, sum: s}
		}
		sort.Sort(sums)
		for i := 0; i < bestT; i++ {
			resIds = append(resIds, sums[i].id)
		}
	}

	for i, id := range resIds {
		if i > 0 {
			fmt.Fprint(writer, " ")
		}
		fmt.Fprint(writer, id)
	}
	fmt.Fprintln(writer)
}
```