#include <bits/stdc++.h>
using namespace std;
using int64 = long long;
int64 n, d, b;
vector<int64> a;
pair<int, int> f(int64 split) {
  vector<int64> v(n, 0);
  int64 sum = 0;
  for (int i = 0; i < n; ++i) {
    int left = 0;
    int right = 0;
    if (sum + a[i] <= split) {
      left = a[i];
    } else if (sum > split) {
      right = a[i];
    } else {
      left = split - sum;
      right = sum + a[i] - split;
    }
    sum += a[i];
    v[i / (d + 1)] += left;
    v[n - 1 - (n - 1 - i) / (d + 1)] += right;
  }
  sum = 0;
  int result_left = 0;
  for (int i = 0; i < (n + 1) / 2; ++i) {
    sum += v[i];
    if (sum >= b) {
      sum -= b;
    } else {
      result_left++;
    }
  }
  sum = 0;
  int result_right = 0;
  for (int i = n - 1; i >= (n + 1) / 2; --i) {
    sum += v[i];
    if (sum >= b) {
      sum -= b;
    } else {
      result_right++;
    }
  }
  return {result_left, result_right};
}
int main() {
  ios::sync_with_stdio(false);
  cout.precision(12);
  cin >> n >> d >> b;
  a.resize(n);
  for (int i = 0; i < n; ++i) cin >> a[i];
  int64 low = 0;
  int64 high = n * b;
  while (low + 1 < high) {
    int mid = low + (high - low) / 2;
    auto p = f(mid);
    if (p.first > p.second) {
      low = mid;
    } else if (p.first < p.second) {
      high = mid;
    } else {
      low = high = mid;
      break;
    }
  }
  auto p1 = f(low);
  auto p2 = f(high);
  cout << min(max(p1.first, p1.second), max(p2.first, p2.second)) << endl;
  return 0;
}
