#define _CRT_SECURE_NO_WARNINGS

#include <cstdio>
#include <cstring>
#include <vector>
#include <iostream>
#include <algorithm>

using namespace std;

int A[100005];
vector<pair<pair<int, int>,int > >vec;

typedef long long ll;

int calc(int target, int N, int M, int V, int P) {
	printf("target=%d,M=%d,P=%d\n", target, M, P);

	vec.clear();

	int i;

	ll limit = (ll)M;
	limit *= (ll)V;


	for (i = 0; i < N; i++) {
		if (A[i] == target && limit >= M) {
			vec.push_back(make_pair(make_pair(A[i] + M, M), i));
			limit -= (ll)M;
		}
		else {
			vec.push_back(make_pair(make_pair(A[i], 0), i));
		}
	}

	sort(vec.begin(), vec.end());


	printf("処理1,limit=%lld\n", limit);
	for (i = vec.size() - 1; i >= 0; i--) {
		printf("score=%d,rank=%d\n", vec[i].first.first, vec[i].first.second);
	}



	for (i = 0; i < vec.size(); i++) {
		if (limit == 0ll) { break; }
		if (vec[i].first.second < M) {
			if (target + M - A[vec[i].second] >= 0) {
				printf("limit=%lld,点数限界=%lld,目標点=%lld,A[i]=%d\n", limit, (ll)M - (ll)vec[i].first.second, (ll)target + (ll)M, A[vec[i].second]);
				ll add = min(limit, min((ll)M - (ll)vec[i].first.second, (ll)target + (ll)M - (ll)A[vec[i].second]));
				vec[i].first.first += (int)add;
				vec[i].first.second += (int)add;
				limit -= add;
				printf("得点=%d,追加点=%d\n", vec[i].first.first, vec[i].first.second);
			}
		}
	}

	for (i = 0; i < vec.size(); i++) {
		vec[i].first.second = -vec[i].first.second;
	}

	sort(vec.begin(), vec.end());


	printf("処理2,limit=%lld\n", limit);
	for (i = vec.size() - 1; i >= 0; i--) {
		printf("score=%d,rank=%d\n", vec[i].first.first, vec[i].first.second);
	}


	for (i = vec.size() - 1; i >= 0; i--) {
		if (limit == 0ll) { break; }
		if (-vec[i].first.second < M) {
			ll add = min(limit, (ll)M + (ll)vec[i].first.second);
			vec[i].first.first += (int)add;
			vec[i].first.second -= (int)add;
			//printf("add=%lld\n", add);
			limit -= add;
		}
	}

	sort(vec.begin(), vec.end());


	printf("処理2.5\n");
	for (i = vec.size() - 1; i >= 0; i--) {
		printf("score=%d,rank=%d\n", vec[i].first.first, vec[i].first.second);
	}


	int rank = 0;
	int cnt = 1;
	int prev = -1;

	for (i = vec.size() - 1; i >= 0; i--) {
		if (prev != vec[i].first.first) {
			rank = cnt;
			prev = vec[i].first.first;
			vec[i].first.second = rank;
		}
		else {
			vec[i].first.second = rank;
		}
		cnt++;
	}

	printf("処理3\n");
	for (i = vec.size() - 1; i >= 0; i--) {
		printf("score=%d,rank=%d\n", vec[i].first.first, vec[i].first.second);
	}


	for (i = vec.size() - 1; i >= 0; i--) {
		if (vec[i].first.first == target + M && vec[i].first.second <= P) {
			printf("target=%dは採用です\n", target);
			return 1;
		}
	}
	printf("target=%dは不採用です\n", target);
	//*/
	return 0;
}

int is_possible(int target,int N,int M,int V,int P) {

	vec.clear();

	int i;

	ll limit = (ll)M;
	limit *= (ll)V;


	for (i = 0; i < N; i++) {
		if (A[i] == target && limit >= M) {
			vec.push_back(make_pair(make_pair(A[i] + M, M), i));
			limit -= (ll)M;
		}
		else {
			vec.push_back(make_pair(make_pair(A[i],0),i));
		}
	}

	sort(vec.begin(),vec.end());


	for (i = 0; i < vec.size(); i++) {
		if (limit == 0ll) { break; }
		if (vec[i].first.second < M) {
			if (target + M - A[vec[i].second] >= 0) {
				ll add = min(limit, min((ll)M - (ll)vec[i].first.second,(ll)target + (ll)M - (ll)A[vec[i].second]));
				vec[i].first.first += (int)add;
				vec[i].first.second += (int)add;
				limit -= add;
			}
		}
	}

	for (i = 0; i < vec.size(); i++) {
		vec[i].first.second = -vec[i].first.second;
	}

	sort(vec.begin(), vec.end());

	for (i = vec.size() - 1; i >= 0; i--) {
		if (limit == 0ll) { break; }
		if (-vec[i].first.second < M) {
			ll add = min(limit, (ll)M + (ll)vec[i].first.second);
			vec[i].first.first += (int)add;
			vec[i].first.second -= (int)add;
			limit -= add;
		}
	}

	sort(vec.begin(), vec.end());


	int rank = 0;
	int cnt = 1;
	int prev = -1;

	for (i = vec.size() - 1; i >= 0; i--) {
		if (prev != vec[i].first.first) { 
			rank = cnt;
			prev = vec[i].first.first; 
			vec[i].first.second = rank;
		}
		else {
			vec[i].first.second = rank;
		}
		cnt++;
	}

	for (i = vec.size() - 1; i >= 0; i--) {
		if (vec[i].first.first == target + M && vec[i].first.second <= P) {
			return 1;
		}
	}
	return 0;
}

int main() {

	int N, M, V, P;

	scanf("%d %d %d %d",&N,&M,&V,&P);

	int i;

	for (i = 0; i < N; i++) {
		scanf(" %d",&A[i]);
	}

	int l, r, mid;

	l = -1;
	r = N;

	int possible = 1000000005;

	sort(A, A + N);

	while (1) {
		if (r - l <= 1) { break; }
		mid = l + (r - l) / 2;
		if (is_possible(A[mid],N,M,V,P) == 1) {
			r = mid;
			if (possible > A[mid]) { possible = A[mid]; }
		}
		else{ 
			l = mid;
		}
	}

	if (is_possible(A[l],N,M,V,P) == 1) { possible = A[l]; }

	//printf("possible=%d\n",possible);

	int ans = 0;

	for (i = 0; i < N; i++) {
		if (A[i] >= possible) { ans++; }
	}

	printf("%d\n",ans);

	return 0;
}


Measured memory_bytes: 2296