#include <bits/stdc++.h>
using namespace std;
int n, d, b;
int arr[100005];
int sz = 1;
long long tree[400005];
void update(int idx, long long val) {
  idx += sz;
  while (idx) {
    tree[idx] += val;
    idx /= 2;
  }
}
long long query(int le, int ri) {
  le += sz;
  ri += sz;
  long long ret = 0;
  while (le <= ri) {
    if (le & 1) ret += tree[le++];
    if (!(ri & 1)) ret += tree[ri--];
    le /= 2;
    ri /= 2;
  }
  return ret;
}
int main() {
  scanf("%d%d%d", &n, &d, &b);
  sz = 1;
  while (sz < n) sz *= 2;
  for (int i = 0; i < n; i++) {
    scanf("%d", &arr[i]);
    update(i, (long long)arr[i]);
  }
  int x1, x2;
  x1 = x2 = 0;
  long long le, ri;
  le = 0, ri = n - 1;
  long long r = 1;
  int dle, dri;
  dle = 0;
  dri = n - 1;
  while (le <= ri) {
    if (le == ri) {
      long long ls = query(max(0ll, le - d * r), min(le + d * r, n - 1ll));
      long long diff = max(0ll, b - ls);
      if (diff) x1++;
      break;
    }
    long long ls = query(max(0ll, le - d * r), min(le + d * r, n - 1ll));
    long long diff = max(0ll, b - ls);
    if (diff) x1++;
    long long up = diff ? 0 : b;
    while (up) {
      long long temp = query(dle, dle);
      if (temp <= up) {
        up -= temp;
        update(dle, -temp);
        dle++;
      } else {
        update(dle, -up);
        up = 0;
      }
    }
    long long rs = query(max(0ll, ri - d * r), min(ri + d * r, n - 1ll));
    diff = max(0ll, b - rs);
    if (diff) x2++;
    up = diff ? 0 : b;
    while (up) {
      long long temp = query(dri, dri);
      if (temp <= up) {
        up -= temp;
        update(dri, -temp);
        dri--;
      } else {
        update(dri, -up);
        up = 0;
      }
    }
    le++;
    ri--;
    r++;
  }
  printf("%d\n", max(x1, x2));
  return 0;
}
