#include <bits/stdc++.h>
using namespace std;
struct cord {
  int x, y, es;
  bool operator<(const cord &otro) const {
    if (y < otro.y or (y == otro.y and x > otro.x)) return true;
    return false;
  }
} A[100005], m;
struct ura {
  int num, cual;
  bool operator()(const ura &b, const ura &a) const {
    if (a.num < b.num) return true;
    return false;
  }
} m2;
int B[100005], ctos, uno, dos, n, p, hay = 0, escoge, van = 0, quita;
priority_queue<ura, vector<ura>, ura> P;
int pon, bajo = 100005;
struct momo {
  int one, which;
  bool operator<(const momo &que) const {
    if (one < que.one) return true;
    return false;
  }
} m3, Z[100005];
int main() {
  scanf("%d%d%d", &ctos, &n, &p);
  for (int i = 1; i <= ctos; i++) {
    scanf("%d%d", &uno, &dos);
    m.x = uno;
    m.y = dos;
    m.es = i;
    A[i] = m;
  }
  sort(A + 1, A + ctos + 1);
  quita = n - p;
  for (int i = quita + 1; i <= ctos; i++) {
    ++hay;
    B[hay] = A[i].x;
  }
  sort(B + 1, B + hay + 1);
  escoge = B[hay - p + 1];
  for (int i = ctos; i > quita; i--) {
    if (A[i].x > escoge) {
      ++van;
      printf("%d ", A[i].es);
      bajo = i;
    }
  }
  for (int i = ctos; van < p; i--) {
    if (A[i].x == escoge) {
      ++van;
      printf("%d ", A[i].es);
      if (van == p) {
        for (int e = 1; e <= quita; e++) {
          m2.cual = e;
          m2.num = A[e].y;
          P.push(m2);
        }
        for (int e = quita + 1; e < min(i, bajo); e++) {
          m2.cual = e;
          m2.num = A[e].y;
          P.push(m2);
          P.pop();
        }
        while (!P.empty()) {
          pon = A[P.top().cual].es;
          printf("%d ", pon);
          P.pop();
        }
      }
    }
  }
  printf("\n");
  return 0;
}
