#include <bits/stdc++.h>
#pragma GCC optimize("Ofast")
using namespace std;
template <class c>
struct rge {
  c b, e;
};
template <class c>
rge<c> range(c i, c j) {
  return rge<c>{i, j};
}
template <class c>
auto dud(c* x) -> decltype(cerr << *x, 0);
template <class c>
char dud(...);
struct debug {
  template <class c>
  debug& operator<<(const c&) {
    return *this;
  }
};
using ll = long long;
using ld = long double;
constexpr int nax = 100 * 1000 + 105;
constexpr int infty = 1000 * 1000 * 1000 + 5;
constexpr int mod = 1000 * 1000 * 1000 + 7;
int n, d, b;
int od;
int a[nax];
int tab[nax];
bool Dasie_(int c) {
  for (int i = 1; i <= n; i++) {
    tab[i] = a[i];
  }
  int nast = n;
  int wsk = n + 1;
  int zle = 0;
  for (int i = n; i >= od; i--) {
    debug() << " ["
            << "i"
               ": "
            << (i)
            << "] "
               " ["
            << "od"
               ": "
            << (od) << "] ";
    nast = min(nast, i - 1);
    wsk = max(wsk - 1 - d, 1);
    while (nast >= wsk and tab[i] < b) {
      const int ile = min(tab[nast], b - tab[i]);
      tab[i] += ile;
      tab[nast] -= ile;
      if (tab[nast] == 0) nast--;
    }
    int oddaj = tab[i];
    if (tab[i] >= b) oddaj = tab[i] - b;
    if (i > od) {
      tab[i - 1] += oddaj;
      tab[i] -= oddaj;
    }
    if (tab[i] < b) {
      zle++;
    }
    if (zle + i - od <= c) {
      break;
    }
  }
  if (zle > c) return false;
  debug() << " ["
          << "range(tab + 1, tab + od)"
             ": "
          << (range(tab + 1, tab + od)) << "] ";
  zle = 0;
  nast = 1;
  wsk = 0;
  for (int i = 1; i < od; i++) {
    debug() << " ["
            << "i"
               ": "
            << (i)
            << "] "
               " ["
            << "od"
               ": "
            << (od) << "] ";
    nast = max(nast, i + 1);
    wsk = min(wsk + 1 + d, od - 1);
    while (nast <= wsk and tab[i] < b) {
      const int ile = min(tab[nast], b - tab[i]);
      tab[i] += ile;
      tab[nast] -= ile;
      if (tab[nast] == 0) nast++;
    }
    int oddaj = tab[i];
    if (tab[i] >= b) oddaj = tab[i] - b;
    if (i < n) {
      tab[i + 1] += oddaj;
      tab[i] -= oddaj;
    }
    debug() << " ["
            << "i"
               ": "
            << (i)
            << "] "
               " ["
            << "tab[i]"
               ": "
            << (tab[i])
            << "] "
               " ["
            << "oddaj"
               ": "
            << (oddaj) << "] ";
    if (tab[i] < b) {
      zle++;
    }
  }
  debug() << " ["
          << "zle"
             ": "
          << (zle) << "] ";
  return zle <= c;
}
bool Dasie(int c) {
  debug() << "Dasie("
             " ["
          << "c"
             ": "
          << (c)
          << "] "
             ")";
  const bool res = Dasie_(c);
  debug() << " ["
          << "res"
             ": "
          << (res) << "] ";
  return res;
}
int Licz() {
  debug() << " ["
          << "n"
             ": "
          << (n)
          << "] "
             " ["
          << "d"
             ": "
          << (d)
          << "] "
             " ["
          << "b"
             ": "
          << (b)
          << "] "
             " ["
          << "od"
             ": "
          << (od) << "] ";
  debug() << range(a + 1, a + n + 1);
  int p = 0, k = n;
  while (p < k) {
    const int c = (p + k) / 2;
    if (Dasie(c)) {
      k = c;
    } else {
      p = c + 1;
    }
  }
  return p;
}
int main() {
  scanf("%d%d%d", &n, &d, &b);
  od = (n + 1) / 2 + 1;
  for (int i = 1; i <= n; i++) {
    scanf("%d", &a[i]);
  }
  const int X = Licz();
  reverse(a + 1, a + n + 1);
  od = n + 1 - od + 1;
  const int Y = Licz();
  printf("%d\n", min(X, Y));
  return 0;
}
