#include <bits/stdc++.h>
using std::abs;
using std::cerr;
using std::cin;
using std::cout;
using std::map;
using std::max;
using std::min;
using std::pair;
using std::set;
using std::string;
using std::swap;
using std::vector;
using ll = long long;
using uint = unsigned int;
using pii = pair<int, int>;
using pll = pair<ll, ll>;
template <typename T>
void _dbg(const char* _s, T _h) {
  cerr << _s << " = " << _h << "\n";
}
template <typename T, typename... Ts>
void _dbg(const char* _s, T _h, Ts... _t) {
  int _b = 0;
  while (((_b += *_s == '(') -= *_s == ')') != 0 || *_s != ',') cerr << *_s++;
  cerr << " = " << _h << ",";
  _dbg(_s + 1, _t...);
}
struct init {
  init() {
    cin.tie(0);
    std::iostream::sync_with_stdio(0);
    cout << std::fixed << std::setprecision(10);
    cerr << std::fixed << std::setprecision(5);
    using namespace std::chrono;
    srand(duration_cast<nanoseconds>(
              high_resolution_clock::now().time_since_epoch())
              .count());
  }
  ~init() {}
} init;
const int MAXN = 1e5 + 15;
int ta[MAXN], a[MAXN];
int n, d, b;
int solve(int x, int rooms) {
  int sum = 0, l = 1, r = 0, res = 0;
  for (int i = 1; i <= rooms; ++i) {
    while (r + 1 - i <= d * i && r < x) {
      sum += a[++r];
    }
    if (sum < b) {
      if (i == l) l++;
      a[l] += a[i];
      res++;
    } else {
      int xex = 0;
      while (1) {
        if (xex + a[l] >= b) {
          int add = b - xex;
          xex += add;
          a[l] -= add;
          sum -= add;
          break;
        } else {
          sum -= a[l];
          xex += a[l];
          a[l] = 0;
          ++l;
        }
      }
    }
  }
  return res;
}
pii check(int m) {
  int x = 1, lt, rt;
  for (int sum = ta[1]; x <= n; sum += ta[++x])
    if (sum >= m) {
      lt = m - (sum - ta[x]);
      rt = ta[x] - lt;
      break;
    }
  for (int i = 1; i < x; ++i) a[i] = ta[i];
  a[x] = lt;
  int l = solve(x, (n + 1) / 2);
  x = n - x + 1;
  for (int i = 1; i < x; ++i) a[i] = ta[n - i + 1];
  a[x] = rt;
  int r = solve(x, (n + 0) / 2);
  return {l, r};
}
int main() {
  cin >> n >> d >> b;
  for (int i = 1; i <= n; ++i) cin >> ta[i];
  int l = -1, r = n * b;
  while (r - l > 1) {
    int m = (l + r) / 2;
    pii g = check(m);
    if (g.first > g.second)
      l = m;
    else
      r = m;
  };
  auto res = check(r);
  cout << max(res.first, res.second) << '\n';
  return 0;
}
