N,M,V,P=list(map(int, input().split()))

*A,=list(map(int, input().split()))



A.sort()

Ax = A[-P]  #上位Pの中の最下位



def f(i):

    mine = A[i] + M #自分に全力で投票

    if mine < Ax: return False #逆転不能

    votes = M*V

    votes -= M #自分への票

    votes -= min(P-1, V) * M #上位陣のx以外に全力で投票

    votes -= sum([min(mine - A[j], M) for j in range(N-P+1) if i!=j]) #逆転されない程度に下位陣に投票

    if votes > 0 : return False #再逆転される

    return True



under = -1

r = N-P

while r-under>1:

    m = (r+under)//2

    if f(m): r=m

    else: under=m



print((N-r))

N,M,V,P=list(map(int, input().split()))

*A,=list(map(int, input().split()))



A.sort()



#A[x]の問題が採用される可能性があるか？

def check(x):

    r = A[-P] #無投票でギリギリ採用される問題のスコア

    if A[x] + M < r:

        return False

    votes = M*V

    votes -= M # A[x]に投票

    votes -= M*(P-1) #上位の問題に投票

    votes -= M*x #下位の問題に投票

    #微妙な問題にギリギリ投票

    for i in range(x+1, N-P+1):

        votes -= A[x]+M - A[i]

    return votes <= 0



l,r=-1,N-1

while r-l>1:

    m=(l+r)//2

    if check(m):

        r=m

    else:

        l=m

print((N-r))

N, M, V, P = list(map(int, input().split()))
(*A,) = list(map(int, input().split()))
A.sort()
Ax = A[-P]  # 上位Pの中の最下位


def f(i):
    mine = A[i] + M  # 自分に全力で投票
    if mine < Ax:
        return False  # 逆転不能
    votes = M * V
    votes -= M  # 自分への票
    votes -= min(P - 1, V) * M  # 上位陣のx以外に全力で投票
    votes -= sum(
        [min(mine - A[j], M) for j in range(N - P + 1) if i != j]
    )  # 逆転されない程度に下位陣に投票
    if votes > 0:
        return False  # 再逆転される
    return True


under = -1
r = N - P
while r - under > 1:
    m = (r + under) // 2
    if f(m):
        r = m
    else:
        under = m
print((N - r))

N, M, V, P = list(map(int, input().split()))
(*A,) = list(map(int, input().split()))
A.sort()
# A[x]の問題が採用される可能性があるか？
def check(x):
    r = A[-P]  # 無投票でギリギリ採用される問題のスコア
    if A[x] + M < r:
        return False
    votes = M * V
    votes -= M  # A[x]に投票
    votes -= M * (P - 1)  # 上位の問題に投票
    votes -= M * x  # 下位の問題に投票
    # 微妙な問題にギリギリ投票
    for i in range(x + 1, N - P + 1):
        votes -= A[x] + M - A[i]
    return votes <= 0


l, r = -1, N - 1
while r - l > 1:
    m = (l + r) // 2
    if check(m):
        r = m
    else:
        l = m
print((N - r))

-Ax = A[-P]  # 上位Pの中の最下位 +# A[x]の問題が採用される可能性があるか？ +def check(x): +    r = A[-P]  # 無投票でギリギリ採用される問題のスコア +    if A[x] + M < r: +        return False +    votes = M * V +    votes -= M  # A[x]に投票 +    votes -= M * (P - 1)  # 上位の問題に投票 +    votes -= M * x  # 下位の問題に投票 +    # 微妙な問題にギリギリ投票 +    for i in range(x + 1, N - P + 1): +        votes -= A[x] + M - A[i] +    return votes <= 0 -def f(i): -    mine = A[i] + M  # 自分に全力で投票 -    if mine < Ax: -        return False  # 逆転不能 -    votes = M * V -    votes -= M  # 自分への票 -    votes -= min(P - 1, V) * M  # 上位陣のx以外に全力で投票 -    votes -= sum( -        [min(mine - A[j], M) for j in range(N - P + 1) if i != j] -    )  # 逆転されない程度に下位陣に投票 -    if votes > 0: -        return False  # 再逆転される -    return True - - -under = -1 -r = N - P -while r - under > 1: -    m = (r + under) // 2 -    if f(m): +l, r = -1, N - 1 +while r - l > 1: +    m = (l + r) // 2 +    if check(m): -        under = m +        l = m