unittest
{
	assert( [ "5 3 5", "1", "2", "3", "6", "12" ].parse.expand.solve == 3 );
	assert( [ "6 3 3", "7", "6", "2", "8", "10", "6" ].parse.expand.solve == 3 );
}



import std.algorithm;
import std.conv;
import std.range;
import std.stdio;
import std.typecons;

void main()
{
	stdin.byLineCopy.parse.expand.solve.writeln;
}

auto parse( Range )( Range input )
if( isInputRange!Range && is( ElementType!Range == string ) )
{
	auto nck = input.front.split.to!( long[] );
	auto ts = new long[ nck[ 0 ] ];
	foreach( ref t; ts )
	{
		input.popFront;
		t = input.front.to!( long );
	}
	return tuple( nck[ 1 ], nck[ 2 ], ts );
}

auto solve( long c, long k, long[] ts )
{
	ts.sort();
	
	auto ans = 0L;
	auto tn = 0L;
	auto tk = 0L;
	foreach( t; ts )
	{
		if( c <= tn || tk < t )
		{
			// 時間or定員オーバーで次のバスに乗せる
			ans++;
			tn = 1;
			tk = t + k;
		}
		else
		{
			// 今のバスに乗せる
			tn++;
		}
	}
	return ans;
}
