import qualified Data.Text as T
import qualified Data.Text.IO as T
import qualified Data.Text.Read as T
import qualified Data.Vector.Unboxed as V
import Data.List (sortBy)

main :: IO ()
main = do
  (n : m : v : p : _) <- map unsafeSignedDecimal . T.words <$> T.getLine :: IO [Int]
  as <- V.fromList . sortBy (flip compare) . map unsafeSignedDecimal . T.words <$> T.getLine :: IO (V.Vector Int)
  let
    search :: (Int, Int) -> Int
    search (i, j) | j == succ i = j
                  | c k         = search (k, j)
                  | otherwise   = search (i, k)
      where
        k = (i + j) `div` 2
    c :: Int -> Bool
    c k | b0 = True
        | b1 = False
        | b2 = False
        | otherwise = True
      where
        b0 = k < p
        b1 = as V.! k + m < as V.! (pred p)
        b2 = m * (pred p + n - k) + sum (map (\i -> as V.! k + m - as V.! pred i) [p..k]) < m * v
  print $ search (0, n)

unsafeSignedDecimal :: T.Text -> Int
unsafeSignedDecimal s = case T.signed T.decimal s of
  Right (n, _) -> n
