#include<iostream>
#include<set>
#include<queue>
using namespace std;
int a[100007];
long long a1[100007];
int main() {
int n, d, i, temp, j, max1, len, flag, k, temp2;
long long p, sum, sum2 = 0;
multiset<int> b, l;
multiset<int>::iterator it;
queue<int> q;
cin >> n >> p >> d;
for (i = 0; i < n; i++) {
cin >> a[i];
/*把这个数对应区间的值加起来。比如题目给的样例,处理后a1[0]=3,a1[1]=4+3,a1[2]=1+4+3,a1[3]=9+1+4-3*/
if (q.size() < d) {
q.push(a[i]);
sum2 = sum2 + q.back();
a1[i] = sum2;
}
else {
q.push(a[i]);
sum2 = sum2 - q.front() + a[i];
q.pop();
a1[i] = sum2;
}
}
for (i = 0; i < n; i++) {
len = 0;
flag = 0;
sum = 0;
for (j = i; j < n; j++) {
sum = sum + a[j];
temp = j + 1;
temp2 = j;
if (sum > p) {/*这个区间累计的值第一次大于p后,开始置0操作*/
flag++;
if (flag == 2)/*第二次又大于p就要记录区间长度并且跳出*/
break;
if (j - d < i)/*j和i的间隔小于d,要满足题意只能把j后移相应长度*/
j = i + d - 1;
max1 = a1[j];
for (k = j; k < temp2 + d; k++) {
if (k == n)
break;
if (a1[k] >= max1) {
max1 = a1[k];
}
}
for (temp; temp < k; temp++)/*把跳过了的那些数加起来*/
sum = sum + a[temp];
sum = sum - max1;
j = k - 1;
}
}
len = j - i;
l.insert(len);/*把长度len放在set类型的l里面,自动排好序了*/
}
it = l.end();
it--;/*输出最后一个(即最大)元素*/
cout << *it;
return 0;
}