← Home
package main

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

type Lemming struct {
	id int
	m  int
	v  int
}

func main() {
	scanner := bufio.NewScanner(os.Stdin)
	scanner.Split(bufio.ScanWords)
	buf := make([]byte, 1024*1024)
	scanner.Buffer(buf, 10*1024*1024)

	scanInt := func() int {
		scanner.Scan()
		res, _ := strconv.Atoi(scanner.Text())
		return res
	}

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

	m := make([]int, n)
	for i := 0; i < n; i++ {
		m[i] = scanInt()
	}

	v := make([]int, n)
	for i := 0; i < n; i++ {
		v[i] = scanInt()
	}

	lemmings := make([]Lemming, n)
	for i := 0; i < n; i++ {
		lemmings[i] = Lemming{id: i + 1, m: m[i], v: v[i]}
	}

	sort.Slice(lemmings, func(i, j int) bool {
		if lemmings[i].m != lemmings[j].m {
			return lemmings[i].m < lemmings[j].m
		}
		return lemmings[i].v < lemmings[j].v
	})

	check := func(t float64) bool {
		size := 0
		for i := 0; i < n; i++ {
			if float64(size+1)*float64(h) <= t*float64(lemmings[i].v) {
				size++
				if size == k {
					return true
				}
			}
		}
		return false
	}

	low := 0.0
	high := 1e11
	for iter := 0; iter < 100; iter++ {
		mid := (low + high) / 2
		if check(mid) {
			high = mid
		} else {
			low = mid
		}
	}

	ans := make([]int, 0, k)
	size := 0
	for i := 0; i < n; i++ {
		if float64(size+1)*float64(h) <= high*float64(lemmings[i].v) {
			ans = append(ans, lemmings[i].id)
			size++
			if size == k {
				break
			}
		}
	}

	out := bufio.NewWriter(os.Stdout)
	defer out.Flush()
	for i := 0; i < k; i++ {
		if i > 0 {
			out.WriteByte(' ')
		}
		fmt.Fprint(out, ans[i])
	}
	out.WriteByte('\n')
}