#include <bits/stdc++.h>
using namespace std;
using namespace std::chrono;
template <typename A>
ostream &operator<<(ostream &cout, vector<A> const &v);
template <typename A, typename B>
ostream &operator<<(ostream &cout, pair<A, B> const &p) {
  return cout << "(" << p.first << ", " << p.second << ")";
}
template <typename A>
ostream &operator<<(ostream &cout, vector<A> const &v) {
  cout << "[";
  for (int i = 0; i < v.size(); i++) {
    if (i) cout << ", ";
    cout << v[i];
  }
  return cout << "]";
}
template <typename A, typename B>
istream &operator>>(istream &cin, pair<A, B> &p) {
  cin >> p.first;
  return cin >> p.second;
}
mt19937 rng(steady_clock::now().time_since_epoch().count());
void usaco(string filename) {
  freopen((filename + ".in").c_str(), "r", stdin);
  freopen((filename + ".out").c_str(), "w", stdout);
}
const long double pi = 3.14159265358979323846;
const long long mod = 998244353;
long long n, m, k, q, Q, T, l, r, x, y, z;
long long a[1000005];
long long b[1000005];
long long c[1000005];
string second, t;
long long ans = 0;
long long jump[100005];
int main() {
  {
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    cout.tie(NULL);
  };
  long long d;
  cin >> n >> d >> k;
  for (int ele = 0; ele < n; ele++) cin >> a[ele];
  ;
  long long lval = (n - 1) / 2, rval = (n - 1) / 2 + 1;
  long long mx = (n + 1) / 2;
  long long l = 0, r = mx + 1;
  while (l < r) {
    long long m = (l + r) / 2;
    long long lpt = lval - m + 1, rpt = rval + m - 1;
    if (n % 2 == 1) --rpt;
    long long ltarg = lpt, rtarg = rpt;
    memset(b, 0, sizeof(b));
    for (long long i = 0; i < (n); i++) jump[i] = -1;
    long long lreach = 0, rreach = n - 1;
    long long lfoc = 0, rfoc = n - 1;
    for (long long i = 0; i < (n); i++) {
      if (i % 2 == 0) {
        lreach += d;
        long long v = a[lfoc];
        while (lfoc - d * (lpt + 1) > lpt) ++lpt;
        while (lpt <= lval && v) {
          if (v >= k - b[lpt]) {
            v -= k - b[lpt];
            b[lpt] = k;
            ++lpt;
          } else {
            b[lpt] += v;
            break;
          }
        }
        long long l1 = rval - 1, r1 = n;
        while (l1 < r1) {
          long long m = (l1 + r1) / 2;
          long long t = n - m;
          long long r = lfoc + t * d;
          if (r >= m)
            l1 = m + 1;
          else
            r1 = m;
        }
        long long rt = min(rpt, l1 - 1);
        long long ort = rt;
        while (rt >= rval && v) {
          if (jump[rt] != -1) rt = jump[rt];
          if (v >= k - b[rt]) {
            v -= k - b[rt];
            b[rt] = k;
            --rt;
          } else {
            b[rt] += v;
            break;
          }
        }
        jump[ort] = rt;
        ++lreach;
        ++lfoc;
      } else {
        rreach -= d;
        long long v = a[rfoc];
        while (rfoc + d * (n - rpt) < rpt) --rpt;
        while (rpt >= rval && v) {
          if (v >= k - b[rpt]) {
            v -= k - b[rpt];
            b[rpt] = k;
            --rpt;
          } else {
            b[rpt] += v;
            break;
          }
        }
        long long l1 = 0, r1 = lval + 1;
        while (l1 < r1) {
          long long m = (l1 + r1) / 2;
          long long t = m + 1;
          long long r = rfoc - t * d;
          if (r <= m)
            r1 = m;
          else
            l1 = m + 1;
        }
        long long lt = max(lpt, r1);
        long long olt = lt;
        while (lt <= lval && v) {
          if (jump[lt] != -1) lt = jump[lt];
          if (v >= k - b[lt]) {
            v -= k - b[lt];
            b[lt] = k;
            ++lt;
          } else {
            b[lt] += v;
            break;
          }
        }
        jump[olt] = lt;
        --rreach;
        --rfoc;
      }
    }
    bool first = 1;
    for (long long i = 0; i < (n); i++) {
      if (ltarg <= i && i <= rtarg && b[i] < k) first = 0;
    }
    if (first)
      l = m + 1;
    else
      r = m;
  }
  cout << mx - l + 1 << endl;
}
