#include <bits/stdc++.h>
int cnt, a, k;
struct node {
  int hit;
  int height;
  struct node *left, *right;
};
int height(struct node *node) {
  if (node == NULL)
    return 0;
  else
    return node->height;
}
struct node *leftRotate(struct node *node) {
  struct node *tmp = node;
  node = node->right;
  tmp->right = node->left;
  tmp->height =
      1 + (height(tmp->left) > height(tmp->right) ? height(tmp->left)
                                                  : height(tmp->right));
  node->left = tmp;
  node->height =
      1 + (height(node->left) > height(node->right) ? height(node->left)
                                                    : height(node->right));
  return node;
}
struct node *rightRotate(struct node *node) {
  struct node *tmp = node;
  node = node->left;
  tmp->left = node->right;
  tmp->height =
      1 + (height(tmp->left) > height(tmp->right) ? height(tmp->left)
                                                  : height(tmp->right));
  node->right = tmp;
  node->height =
      1 + (height(node->left) > height(node->right) ? height(node->left)
                                                    : height(node->right));
  return node;
}
struct node *insert(struct node *node, int hit, int down, int up) {
  if (node == NULL) {
    node = (struct node *)malloc(sizeof *node);
    cnt -= (up - down) / (a + 1);
    cnt += (up - hit) / (a + 1);
    cnt += (hit - down) / (a + 1);
    node->hit = hit;
    node->height = 1;
    node->left = NULL;
    node->right = NULL;
    return node;
  }
  if (node->hit < hit)
    node->right = insert(node->right, hit, node->hit, up);
  else
    node->left = insert(node->left, hit, down, node->hit);
  switch (height(node->right) - height(node->left)) {
    case 2:
      if (height(node->right->right) < height(node->right->left))
        node->right = rightRotate(node->right);
      node = leftRotate(node);
      break;
    case -2:
      if (height(node->left->left) < height(node->left->right))
        node->left = leftRotate(node->left);
      node = rightRotate(node);
      break;
    default:
      node->height =
          1 + (height(node->left) > height(node->right) ? height(node->left)
                                                        : height(node->right));
  }
  return node;
}
void printTree(struct node *node) {
  if (node == NULL) return;
  printf("%i %i  ", node->hit, node->height);
  printTree(node->left);
  printTree(node->right);
}
int main() {
  int i, n, m, hit;
  scanf("%d %d %d\n", &n, &k, &a);
  scanf("%d\n", &m);
  cnt = (n + 1) / (a + 1);
  struct node *root = NULL;
  for (i = 1; i <= m; i++) {
    scanf("%d", &hit);
    if (hit > n || hit < 1) continue;
    root = insert(root, hit, 0, n + 1);
    if (cnt < k) {
      printf("%i\n", i);
      return 0;
    }
  }
  printf("-1\n");
  return 0;
}
