import 'dart:convert';
import 'dart:io';
import 'dart:async';

Future main() async {
  List nck = stdin.readLineSync().split(" ").map((x) => int.parse(x)).toList();
  Stream<String> tLines =
      stdin.transform(utf8.decoder).transform(LineSplitter()); // ここ大事（複数行入力）

  int ti;
  List ab = [];
  List abi = [];
  List limits = [];
  int limit0 = 0;
  int limit1 = 0;
  List tList = [];
  int lineNum;
  lineNum = 1;
  await for (String line in tLines) {
    lineNum = lineNum + 1;
    ti = int.parse(line);
    tList.add(ti);
    limits.add(ti + nck[2]);

    if (lineNum > nck[0]) break; // ここの場所！
  }
  int i = 0;
  List cutS = tList;
  int count = 1;
  for (int j = 0; j < nck[0]; j++) {
    // print("i$i");
    // print("cutS$cutS");
    // print("j$j");
    if (cutS.length <= 1) {
      break;
    }
    if ((i + 1) <= nck[1]) {
      // print("tList[i]+ nck[2]${tList[i] + nck[2]}");
      // print("tList[i+1]${tList[i + 1]}");
      if ((tList[i] + nck[2] < tList[i + 1])) {
        // print("t4est$i");
        cutS.removeRange(0, i + 1); //i+1とするのだいじ

        // print("cutS$cutS");
        i = 0;
        count++;
        // print("count$count");
        continue;
      }
    }

    // print("count$count");
    i++;
    if ((i + 1) == nck[1]) {
      // print("test");
      cutS.removeRange(0, i + 1);
      // print("i$i");
      // print("cutS$cutS");
      // print("j$j");
      i = 0;
      count++;
      // print("count$count");
      continue;
    }
  }
  print(count);
}
