#include <iostream>
#include <vector>
#include <algorithm>
#include <string>
#include <map>
#include <queue>
#include <deque>
#include <cstdio>
#define FOR(i,a,b) for(int i=(a);i<(b);i++)
#define FORE(i,a,b) for(int i=(a);i<=(b);i++)
#define REP(i,b) FOR(i,0,b)
int dx[5]={0,1,0,-1,0}, dy[5]={1,0,-1,0,0};
using namespace std;
typedef long long ll;
const ll INF=(ll)1<<60;
typedef pair<int,int> pr;
typedef pair<int,pr> ppr;
typedef vector<int> vi;
typedef vector<pr> vpr;
const int size=100001;
const int segSize=1+(1<<18);
ll N,M,C,a[size]={};
ll segmentL[segSize]={},segmentR[segSize]={};
ll getMax(ll segment[segSize],int now,int tall,int s,int e){
		int nS=now*(1<<(18-(tall+1)))-(1<<17),nE=(now+1)*(1<<(18-(tall+1)))-1-(1<<17);
		if(s<=nS&&nE<=e)
		return segment[now];
		if(s>nE||e<nS)
		return -INF;
		return max(getMax(segment,now*2+1,tall+1,s,e),getMax(segment,now*2,tall+1,s,e));
}
void check(ll segment[segSize],int R){
	if(R==0)
	return;
	else
	segment[R]=max(segment[R*2],segment[R*2+1]);
	check(segment,R/2);
	return;
}
void put(ll segment[segSize],int num,ll value){
	segment[(1<<17)+num]=value;
	check(segment,((1<<17)+num)/2);
}
bool able(int R){
	ll sum=0;
	REP(i,N){
	 	sum+=max(getMax(segmentL,1,0,max(0,i-R),i)+(ll)(N-i-1)*C,getMax(segmentR,1,0,i,min(N-1,(ll)i+R))+(ll)(i*C));

	}
	return sum>=M;
}
int main() {
	cin >> N >> M >> C;
	REP(i,segSize){
		segmentL[i]=-INF;
		segmentR[i]=-INF;
	}
	REP(i,N){
	cin >>a[i];
	put(segmentL,i,a[i]-(N-i-1)*C);
	put(segmentR,i,a[i]-(i*C));
	}
	int s=0,e=N-1;
	while(s<=e){
		int next=(s+e)/2;
		if(able(next))
		e=next-1;
		else
		s=next+1;
	}
	if(s==N)
	cout <<-1<<endl;
	else
	cout << s << endl;
	// your code goes here
	return 0;
}
