#include <bits/stdc++.h>
using namespace std;
template <class T>
T By(T x, T y, T P) {
  T F1 = 0;
  while (y) {
    if (y & 1) {
      F1 += x;
      if (F1 < 0 || F1 >= P) F1 -= P;
    }
    x <<= 1;
    if (x < 0 || x >= P) x -= P;
    y >>= 1;
  }
  return F1;
}
template <class T>
T Mul(T x, T y, T P) {
  T F1 = 1;
  x %= P;
  while (y) {
    if (y & 1) {
      F1 = By(F1, x, P);
    }
    x = By(x, x, P);
    y >>= 1;
  }
  return F1;
}
template <class T>
T Gcd(T x, T y) {
  if (y == 0) return x;
  T z;
  while (z = x % y) {
    x = y, y = z;
  }
  return y;
}
struct EDGE {
  int T;
  EDGE *Nxt;
};
template <class T>
void UpdataMin(T &x, T y) {
  if (y < x) {
    x = y;
  }
}
template <class T>
void UpdataMax(T &x, T y) {
  if (x < y) {
    x = y;
  }
}
int N, K;
priority_queue<int> Q;
int A[100001];
long long B, Now;
int Ans;
int main() {
  scanf("%d%d", &N, &K);
  --K;
  scanf("%I64d", &B);
  Ans = N;
  for (int i = 1; i <= (N); ++i) {
    scanf("%d", A + i);
  }
  for (int i = (N - 1); 0 < i; --i) {
    if (Now + A[i] > B) Ans = i;
    if (K != 0) {
      if ((int)Q.size() == K) {
        if (-Q.top() < A[i]) {
          Now += Q.top();
          Q.pop();
          Q.push(-A[i]);
          Now += A[i];
        }
      } else {
        Q.push(-A[i]);
        Now += A[i];
      }
    }
  }
  printf("%d\n", Ans);
  scanf("%d", &N);
  return 0;
}
