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



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 nmvp = input.front.split.to!( long[] );
	input.popFront;
	auto as = input.front.split.to!( long[] );
	return tuple( nmvp[ 1 ], nmvp[ 2 ], nmvp[ 3 ], as );
}

auto solve( long m, long v, long p, long[] as )
{
	as.sort!( ( x, y ) => y < x );
	auto ap = as[ p - 1 ];
	
	// 採用可能性有無の境目を二分探索
	auto ans = 0L;
	auto l = 0L;
	auto r = as.length.signed - 1;
	while( l < r )
	{
		auto c = ( l + r + 1 ) / 2;
		auto ac = as[ c ];
		
		auto ok = false;
		if( ap <= ac )
		{
			// 最初からp問以内に入っている場合、全ジャッジがp問に投票すれば採用される
			ok = true;
		}
		else if( ac + m < ap )
		{
			// +m点してもp問以内に入れない場合、どうやっても無理
			ok = false;
		}
		else
		{
			// 投票されるとacの採用可否に影響する問題をピックアップ
			// （スコアが大きい順にp-1問 もしくは ac以下のスコアの問題 は投票されても影響しない）
			auto bs = as[ p - 1 .. c ];
			auto vr = v - ( as.length.signed - bs.length.signed );
			if( vr <= 0 )
			{
				// bsに対して投票する必要がないので採用される
				ok = true;
			}
			else
			{
				// bsに対してm人がvr問ずつ投票したときにac+m点以下にできるか？
				// 各bへの投票可能数はm以下確定なので、単純に投票可能数合計を計算して投票数合計以下ならOK
				auto t = reduce!( ( x, y ) => x + ac + m - y )( 0L, bs );
				ok = ( m * vr <= t );
			}
		}
		
		if( ok ) l = c;
		else     r = c - 1;
	}
	return l + 1;
}
