#include <bits/stdc++.h>
using namespace std;
const long long mod = 1e9 + 7;
long long t[444444], p[444444];
void push(long long v) {
  if (p[v] == 0) return;
  p[v] = 0;
  p[v * 2] = 1;
  p[v * 2 + 1] = 1;
  t[v] = 0;
  t[v * 2] = 0;
  t[v * 2 + 1] = 0;
}
void mt(long long v, long long tl, long long tr, long long i, long long a) {
  if (tl == tr) {
    t[v] += a;
    return;
  }
  push(v);
  long long tm = (tl + tr) / 2;
  if (tm >= i)
    mt(v * 2, tl, tm, i, a);
  else
    mt(v * 2 + 1, tm + 1, tr, i, a);
  t[v] = t[v * 2] + t[v * 2 + 1];
}
long long get(long long v, long long tl, long long tr, long long l,
              long long r) {
  if (l > r) return 0;
  if (tl == tr && p[v] == 1) {
    t[v] = 0;
    p[v] = 0;
  } else
    push(v);
  if (tl == l && tr == r) {
    return t[v];
  }
  long long tm = (tl + tr) / 2;
  return get(v * 2, tl, tm, l, min(r, tm)) +
         get(v * 2 + 1, tm + 1, tr, max(tm + 1, l), r);
}
void gm(long long v, long long tl, long long tr, long long l, long long r) {
  if (l > r) return;
  if (tl == l && tr == r) {
    p[v] = 1;
    if (tl == tr && p[v] == 1) {
      p[v] = 0;
      t[v] = 0;
    } else
      push(v);
    return;
  }
  push(v);
  long long tm = (tl + tr) / 2;
  gm(v * 2, tl, tm, l, min(tm, r));
  gm(v * 2 + 1, tm + 1, tr, max(l, tm + 1), r);
}
long long n, m, z, k, b, p1, p2, l, r, ot1, ot2, a, i, c;
int main() {
  ios_base::sync_with_stdio(0);
  cin.tie(0);
  cin >> n >> k >> b;
  for (i = 1; i <= n; i++) {
    cin >> a;
    mt(1, 1, n, i, a);
  }
  p1 = 1;
  p2 = n;
  while (p1 <= p2) {
    l = 1;
    r = min(n, (p1 + p1 * k));
    while (l + 1 < r) {
      c = (l + r) / 2;
      if (get(1, 1, n, 1, c) >= b)
        r = c - 1;
      else
        l = c;
    }
    if (l != 1)
      if (get(1, 1, n, 1, l) >= b) l--;
    if (l < min(n, (p1 + p1 * k)))
      if (get(1, 1, n, 1, l + 1) < b) l++;
    if (l == min(n, (p1 + p1 * k)))
      ot1++;
    else {
      a = get(1, 1, n, 1, l);
      if (a >= b) {
        gm(1, 1, n, 1, l - 1);
        mt(1, 1, n, l, -b);
      } else {
        gm(1, 1, n, 1, l);
        mt(1, 1, n, l + 1, -(b - a));
      }
    }
    p1++;
    if (p1 > p2) continue;
    l = max(1LL, p2 - (n - p2 + 1) * k);
    r = n;
    while (l + 1 < r) {
      c = (l + r) / 2;
      if (get(1, 1, n, c, n) >= b)
        l = c + 1;
      else
        r = c;
    }
    if (l != n)
      if (get(1, 1, n, l, n) >= b) l++;
    if (l > max(1LL, p2 - (n - p2 + 1) * k))
      if (get(1, 1, n, l - 1, n) < b) l--;
    if (l == max(1LL, p2 - (n - p2 + 1) * k))
      ot2++;
    else {
      a = get(1, 1, n, l, n);
      if (a >= b) {
        mt(1, 1, n, l, -b);
        gm(1, 1, n, l + 1, n);
      } else {
        gm(1, 1, n, l, n);
        mt(1, 1, n, l - 1, -(b - a));
      }
    }
    p2--;
  }
  cout << max(ot1, ot2);
}
