#include <bits/stdc++.h>
using namespace std;
const int maxn = 1e5 + 10;
const int INF = 0x3f3f3f3f;
int n, h, m, k;
pair<int, int> arr[maxn];
vector<int> out;
int calc(int l, int r, int s) {
  if (l <= r) {
    int low = lower_bound(arr + 1, arr + 1 + n, make_pair(l, 0)) - arr;
    int up = upper_bound(arr + 1, arr + 1 + n, make_pair(r, INF)) - arr;
    --up;
    if (s) {
      for (int i = low; i <= up; i++) out.emplace_back(arr[i].second);
    }
    return max(0, up - low + 1);
  }
  swap(l, r);
  int low = upper_bound(arr + 1, arr + 1 + n, make_pair(l, INF)) - arr;
  --low;
  if (s) {
    for (int i = 1; i <= low; i++) out.emplace_back(arr[i].second);
  }
  int up = lower_bound(arr + 1, arr + 1 + n, make_pair(r, 0)) - arr;
  if (s) {
    for (int i = up; i <= n; i++) out.emplace_back(arr[i].second);
  }
  return low + (n - up + 1);
}
int solve(int t, int s) {
  t = (t + m) % m;
  int s1 = t;
  int t1 = (s1 + k - 1) % m;
  int s2 = (t + m / 2) % m;
  int t2 = (s2 + k - 1) % m;
  return calc(s1, t1, s) + calc(s2, t2, s);
}
int main() {
  scanf("%d%d%d%d", &n, &h, &m, &k);
  --k;
  for (int i = 1; i <= n; i++) {
    int h;
    scanf("%d%d", &h, &arr[i].first);
    arr[i].second = i;
  }
  if (k == 0) {
    printf("0 0\n");
    return 0;
  }
  sort(arr + 1, arr + 1 + n);
  int ans = INF;
  int t = 0;
  for (int i = 1; i <= n; i++) {
    int nt = arr[i].first + 1;
    int ncnt = solve(nt, 0);
    if (ncnt < ans) {
      ans = ncnt;
      t = arr[i].first + k + 1;
    }
    nt = arr[i].first - k;
    ncnt = solve(nt, 0);
    if (ncnt < ans) {
      ans = ncnt;
      t = arr[i].first;
    }
  }
  printf("%d %d\n", ans, t % (m / 2));
  solve(t - k, 1);
  int lens = out.size();
  for (int i = 0; i < lens; i++)
    printf("%d%c", out[i], i == lens - 1 ? '\n' : ' ');
  return 0;
}
