using System;
using System.Linq;

public class Program
{
    private int N, M, V, P;
    private int[] A;

    public void Solve()
    {
        var sc = new Scanner();
        N = sc.NextInt();
        M = sc.NextInt();
        V = sc.NextInt();
        P = sc.NextInt();
        A = sc.IntArray();
        Array.Sort(A, (a, b) => -a.CompareTo(b));
        /*
         * target強がP未満
         */
        int ok = 0;
        int ng = N;
        while (ng - ok > 1)
        {
            int med = (ok + ng) / 2;

            if (C(med))
            {
                ok = med;
            }
            else
            {
                ng = med;
            }
        }

        Console.WriteLine(ng);
    }

    bool C(int n)
    {
        int[] cp = A.ToArray();
        long tmp = (long) M * V;
        int[] t = new int[N];
        for (int i = 0; i < N; i++)
        {
            t[i] = M;
        }

        int target = A[n] + M;
        cp[n] += M;
        tmp -= M;
        t[n] -= M;

        for (int i = N - 1; i >= 0; i--)
        {
            if (cp[i] < target)
            {
                int d = Math.Min(M, target - cp[i]);
                t[i] -= d;
                cp[i] += d;
                tmp -= d;
            }
        }
        // 全部 target 以上


        for (int i = 0; i < N; i++)
        {
            if (cp[i] > target)
            {
                int d = t[i];
                cp[i] += d;
                t[i] -= d;
                tmp -= d;
            }
        }

        var index = new int[N];
        for (int i = 0; i < N; i++)
        {
            index[i] = i;
        }

        Array.Sort(index, (a, b) => -t[a].CompareTo(t[b]));

        for (int i = 0; i < N && tmp > 0; i++)
        {
            int d = t[index[i]];
            cp[index[i]] += d;
            t[index[i]] -= d;
            tmp -= d;
        }

        if (tmp > 0) return false;

        return cp.Count(i => i > target) < P;
    }

    public static void Main(string[] args)
    {
        new Program().Solve();
    }
}

class Scanner
{
    public Scanner()
    {
        _pos = 0;
        _line = new string[0];
    }

    const char Separator = ' ';
    private int _pos;
    private string[] _line;

    #region スペース区切りで取得

    public string Next()
    {
        if (_pos >= _line.Length)
        {
            _line = Console.ReadLine().Split(Separator);
            _pos = 0;
        }

        return _line[_pos++];
    }

    public int NextInt()
    {
        return int.Parse(Next());
    }

    public long NextLong()
    {
        return long.Parse(Next());
    }

    public double NextDouble()
    {
        return double.Parse(Next());
    }

    #endregion

    #region 型変換

    private int[] ToIntArray(string[] array)
    {
        var result = new int[array.Length];
        for (int i = 0; i < array.Length; i++)
        {
            result[i] = int.Parse(array[i]);
        }

        return result;
    }

    private long[] ToLongArray(string[] array)
    {
        var result = new long[array.Length];
        for (int i = 0; i < array.Length; i++)
        {
            result[i] = long.Parse(array[i]);
        }

        return result;
    }

    private double[] ToDoubleArray(string[] array)
    {
        var result = new double[array.Length];
        for (int i = 0; i < array.Length; i++)
        {
            result[i] = double.Parse(array[i]);
        }

        return result;
    }

    #endregion

    #region 配列取得

    public string[] Array()
    {
        if (_pos >= _line.Length)
            _line = Console.ReadLine().Split(Separator);

        _pos = _line.Length;
        return _line;
    }

    public int[] IntArray()
    {
        return ToIntArray(Array());
    }

    public long[] LongArray()
    {
        return ToLongArray(Array());
    }

    public double[] DoubleArray()
    {
        return ToDoubleArray(Array());
    }

    #endregion
}

Measured memory_bytes: 34516