#include <iostream>
#include <vector>
#include <algorithm>
#include <string>
#include <sstream>
#include <cstring>
#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <queue>
#include <stack>
#include <map>
#include <set>
#include <numeric>
#include <cctype>
#include <tuple>
#include <array>
#include <climits>
#include <bitset>

// BEGIN CUT HERE
#ifdef _MSC_VER
#include <agents.h>
#endif
// END CUT HERE 

#define FOR(i, a, b) for(int i = (a); i < (int)(b); ++i)
#define rep(i, n) FOR(i, 0, n)
#define ALL(v) v.begin(), v.end()
#define REV(v) v.rbegin(), v.rend()
#define MEMSET(v, s) memset(v, s, sizeof(v))
#define MP make_pair
#define MT make_tuple

using namespace std;

typedef pair<int, int> P;
typedef long long ll;

const int N = 1e5 + 10;

template <class T>
struct SegTree{
	int n;
	vector<T> lazy, Max;

	SegTree(int size){
		n = 1;
		while (n < size) n *= 2;

		lazy = Max = vector<T>(n * 2);
	}

	void add(int i, T val){
		add_range(i, i + 1, val);
	}
	void add_range(int a, int b, T val){
		add_range(a, b, val, 0, 0, n);
	}
	void add_range(int a, int b, T val, int k, int l, int r){
		if (r <= a || b <= l) return;
		if (a <= l && r <= b){
			Max[k] += val;
			lazy[k] += val;
			return;
		}

		add_range(a, b, val, k * 2 + 1, l, (l + r) / 2);
		add_range(a, b, val, k * 2 + 2, (l + r) / 2, r);

		Max[k] = max(Max[k * 2 + 1], Max[k * 2 + 2]) + lazy[k];
	}

	T query_max(int a, int b){
		return query_max(a, b, 0, 0, n);
	}

	T query_max(int a, int b, int k, int l, int r){
		if (r <= a || b <= l) return -1e15;
		if (a <= l && r <= b) return Max[k];
		return max(query_max(a, b, k * 2 + 1, l, (l + r) / 2), query_max(a, b, k * 2 + 2, (l + r) / 2, r)) + lazy[k];
	}
};

ll a[N];

ll n, m, c;
ll check(int R){
	SegTree<ll> rmq(n);

	ll res = 0;
	for (int i = 0; i < min((int)n, R+1); ++i){
		rmq.add(i, a[i] - i*c);
	}
	for (int i = 0; i < n; ++i){
		int l = max(i - R, 0);
		int r = min(i + R + 1, (int)n);

		res += rmq.query_max(l, r);
		//cout << "***" << rmq.query_max(l, r) << endl;
		//for (int j = l; j < r; ++j) cout << rmq.query_max(j, j + 1) << endl;
		//cout << endl;

		rmq.add_range(l, i + 1, -c);
		rmq.add_range(i + 1, r, c);
		if (i + R + 1 < n) rmq.add(i + R + 1, a[i + R + 1] - R*c);
	}

	return res;
}


int main(){
	cin.tie(0);
	ios::sync_with_stdio(false);

	cin >> n >> m >> c;
	rep(i, n) cin >> a[i];

	int lb = -1, ub = 1e5 + 10;
	while (ub - lb > 1){
		int mid = (ub + lb) / 2;
		if (check(mid) >= m) ub = mid;
		else lb = mid;
	}

	if(ub <= 100000) cout << ub << endl;
	else cout << -1 << endl;


	return 0;
}
