#include <bits/stdc++.h>
using namespace std;
inline int read() {
  int x = 0, f = 1;
  char ch = getchar();
  while (ch < '0' || ch > '9') {
    if (ch == '-') f = -1;
    ch = getchar();
  }
  while (ch >= '0' && ch <= '9') {
    x = x * 10 + (ch ^ 48);
    ch = getchar();
  }
  return x * f;
}
const int N = 100010;
long double eps = 1e-15;
struct node {
  int v, w, idx;
  bool operator<(const node& rhs) const {
    return w == rhs.w ? v < rhs.v : w < rhs.w;
  }
} a[N];
int n, k, h, ans[N], out[N], cnt;
long double l, r;
inline bool check(long double x) {
  int idx = 1;
  memset(ans, 0, sizeof(ans));
  for (int i = 1; i <= n; ++i) {
    if ((long double)idx * h <= (x + eps) * (long double)a[i].v) {
      ans[idx++] = a[i].idx;
    }
  }
  return idx > k;
}
int main() {
  n = read();
  k = read();
  h = read();
  if (n < 1000) eps = 1e-18;
  for (int i = 1; i <= n; ++i) a[i].w = read();
  for (int i = 1; i <= n; ++i) a[i].v = read(), a[i].idx = i;
  sort(a + 1, a + n + 1);
  long double l = 0, r = k * h;
  while (l <= r - eps && cnt++ <= 1000) {
    long double mid = (l + r) / 2;
    if (check(mid)) {
      memcpy(out, ans, sizeof(out));
      r = mid;
    } else
      l = mid;
  }
  for (int i = 1; i <= k; ++i) printf("%d ", out[i]);
  return 0;
}
