#include <bits/stdc++.h>
using namespace std;
struct LazyST {
  vector<long long> st, lazy;
  int n;
  LazyST(int n) : st(4 * n + 5, 0), lazy(4 * n + 5, 0), n(n) {}
  void init(int k, int s, int e, long long *a) {
    lazy[k] = 0;
    if (s + 1 == e) {
      st[k] = a[s];
      return;
    }
    int m = (s + e) / 2;
    init(2 * k, s, m, a);
    init(2 * k + 1, m, e, a);
    st[k] = st[2 * k] + st[2 * k + 1];
  }
  void push(int k, int s, int e) {
    if (!lazy[k]) return;
    st[k] += (e - s) * lazy[k];
    if (s + 1 < e) {
      lazy[2 * k] += lazy[k];
      lazy[2 * k + 1] += lazy[k];
    }
    lazy[k] = 0;
  }
  void upd(int k, int s, int e, int a, int b, long long v) {
    push(k, s, e);
    if (s >= b || e <= a) return;
    if (s >= a && e <= b) {
      lazy[k] += v;
      push(k, s, e);
      return;
    }
    int m = (s + e) / 2;
    upd(2 * k, s, m, a, b, v);
    upd(2 * k + 1, m, e, a, b, v);
    st[k] = st[2 * k] + st[2 * k + 1];
  }
  long long query(int k, int s, int e, int a, int b) {
    if (s >= b || e <= a) return 0;
    push(k, s, e);
    if (s >= a && e <= b) return st[k];
    int m = (s + e) / 2;
    return query(2 * k, s, m, a, b) + query(2 * k + 1, m, e, a, b);
  }
  void init(long long *a) { init(1, 0, n, a); }
  void upd(int a, int b, long long v) { upd(1, 0, n, a, b, v); }
  long long query(int a, int b) { return query(1, 0, n, a, b); }
};
const pair<int, int> NEUT = {0, 0};
struct STree {
  int n;
  vector<pair<int, int> > t;
  STree(int n) : n(n), t(2 * n + 5, NEUT) {}
  void upd(int p, pair<int, int> value) {
    for (t[p += n] = value; p > 1; p >>= 1) t[p >> 1] = max(t[p], t[p ^ 1]);
  }
  pair<int, int> query(int l, int r) {
    pair<int, int> res = NEUT;
    for (l += n, r += n; l < r; l >>= 1, r >>= 1) {
      if (l & 1) res = max(res, t[l++]);
      if (r & 1) res = max(res, t[--r]);
    }
    return res;
  }
};
const int MAXN = 2e5 + 15;
int n, k;
struct Range {
  int l, r, id;
  Range(int l, int r, int id) : l(l), r(r), id(id) {}
  bool operator<(Range b) const {
    if (l != b.l) return l < b.l;
    return r < b.r;
  }
};
int main() {
  ios::sync_with_stdio(false);
  cin.tie(0);
  cout.tie(0);
  cin >> n >> k;
  vector<Range> v;
  LazyST rng(MAXN);
  STree st(MAXN);
  for (int i = 0, ggdem = n; i < ggdem; i++) {
    int x, y;
    cin >> x >> y;
    x--;
    rng.upd(x, y, 1);
    v.push_back(Range(x, y, i + 1));
  }
  sort(v.begin(), v.end());
  for (int i = 0, ggdem = n; i < ggdem; i++) st.upd(i, {v[i].r, i});
  vector<int> res;
  for (int i = 0, ggdem = MAXN; i < ggdem; i++) {
    while (rng.query(i, i + 1) > k) {
      auto it = upper_bound(v.begin(), v.end(), Range(i, MAXN, -1)) - v.begin();
      int x = st.query(0, it).second;
      rng.upd(v[x].l, v[x].r, -1);
      res.push_back(v[x].id);
      st.upd(x, {0, -1});
    }
  }
  cout << ((int)(res).size()) << "\n";
  for (int i = 0, ggdem = ((int)(res).size()); i < ggdem; i++)
    cout << res[i] << " \n"[i == ((int)(res).size()) - 1];
}
