Problem: The only difference between easy and hard versions is constraints.

You are given n segments on the coordinate axis OX. Segments can intersect, lie inside each other and even coincide. The i-th segment is [l_i; r_i] (l_i ≤ r_i) and it covers all integer points j such that l_i ≤ j ≤ r_i.

The integer point is called bad if it is covered by strictly more than k segments.

Your task is to remove the minimum number of segments so that there are no bad points at all.

Input

The first line of the input contains two integers n and k (1 ≤ k ≤ n ≤ 200) — the number of segments and the maximum number of segments by which each integer point can be covered.

The next n lines contain segments. The i-th line contains two integers l_i and r_i (1 ≤ l_i ≤ r_i ≤ 200) — the endpoints of the i-th segment.

Output

In the first line print one integer m (0 ≤ m ≤ n) — the minimum number of segments you need to remove so that there are no bad points.

In the second line print m distinct integers p_1, p_2, ..., p_m (1 ≤ p_i ≤ n) — indices of segments you remove in any order. If there are multiple answers, you can print any of them.

Examples

Input


7 2
11 11
9 11
7 8
8 9
7 8
9 11
7 9


Output


3
1 4 7 


Input


5 1
29 30
30 30
29 29
28 30
30 30


Output


3
1 2 4 


Input


6 1
2 3
3 3
2 3
2 2
2 3
2 3


Output


4
1 3 5 6 

Solution (in CPP):

Solution:
#include <bits/stdc++.h>
#pragma GCC optimize(2)
using namespace std;
const long long INF = 1e17;
const int maxn = 1e6;
const int mod = 10007;
const double eps = 1e-9;
const double PI = acos(-1);
inline bool read(long long &num) {
  char in;
  bool IsN = false;
  in = getchar();
  if (in == EOF) return false;
  while (in != '-' && (in < '0' || in > '9')) in = getchar();
  if (in == '-') {
    IsN = true;
    num = 0;
  } else
    num = in - '0';
  while (in = getchar(), in >= '0' && in <= '9') {
    num *= 10, num += in - '0';
  }
  if (IsN) num = -num;
  return true;
}
long long n, m, p;
long long sum[maxn];
vector<int> res, ans;
long long minl, maxl;
struct node {
  int l, r, id;
  bool friend operator<(node a, node b) { return a.r < b.r; }
} qr[maxn];
struct Node {
  int l, r, id;
  bool friend operator<(Node a, Node b) { return a.l > b.l; }
};
void update(int pos, int w) {
  while (pos <= maxl) {
    sum[pos] += w;
    pos += pos & -pos;
  }
}
long long GetSum(int pos) {
  long long ans = 0;
  while (pos > 0) {
    ans += sum[pos];
    pos -= pos & -pos;
  }
  return ans;
}
vector<node> v[maxn];
vector<Node> g[maxn];
int main() {
  minl = INF, maxl = -INF;
  read(n);
  read(m);
  for (int i = 1; i <= n; i++) {
    scanf("%d%d", &qr[i].l, &qr[i].r);
    minl = min(minl, (long long)qr[i].l);
    maxl = max(maxl, (long long)qr[i].r);
    qr[i].id = i;
    v[qr[i].l].push_back(qr[i]);
    g[qr[i].r].push_back(Node{qr[i].l, qr[i].r, qr[i].id});
    update(qr[i].l, 1);
    update(qr[i].r + 1, -1);
  }
  priority_queue<node> q;
  priority_queue<Node> q1;
  for (int i = minl; i <= maxl; i++) {
    for (node x : v[i]) q.push(x);
    long long temp = GetSum(i);
    while (temp > m) {
      node u = q.top();
      q.pop();
      res.push_back(u.id);
      update(u.l, -1);
      update(u.r + 1, 1);
      temp--;
    }
  }
  for (int i = minl; i <= maxl; i++) sum[i] = 0;
  for (int i = 1; i <= n; i++) {
    update(qr[i].l, 1);
    update(qr[i].r + 1, -1);
  }
  for (int i = maxl; i >= minl; i--) {
    for (Node x : g[i]) q1.push(x);
    long long temp = GetSum(i);
    while (temp > m) {
      Node u = q1.top();
      q1.pop();
      ans.push_back(u.id);
      update(u.l, -1);
      update(u.r + 1, 1);
      temp--;
    }
  }
  if (res.size() < ans.size()) {
    printf("%d\n", res.size());
    for (int x : res) {
      printf("%d ", x);
    }
  } else {
    printf("%d\n", ans.size());
    for (int x : ans) {
      printf("%d ", x);
    }
  }
  return 0;
}