#include <bits/stdc++.h>
using namespace std;
const int MAXN = 1e5 * 2 + 10;
int n, len, h;
struct node {
  int flag, mx, l, r;
} t[MAXN << 2];
int a[MAXN], b[MAXN];
int L[MAXN];
void push_down(int k) {
  if (t[k].flag) {
    t[k << 1].flag += t[k].flag;
    t[k << 1 | 1].flag += t[k].flag;
    t[k << 1].mx += t[k].flag;
    t[k << 1 | 1].mx += t[k].flag;
    t[k].flag = 0;
  }
}
void push_up(int k) { t[k].mx = min(t[k << 1].mx, t[k << 1 | 1].mx); }
void build(int l, int r, int k) {
  t[k].l = l;
  t[k].r = r;
  t[k].flag = 0;
  if (t[k].l == t[k].r) {
    t[k].mx = -t[k].l;
    return;
  }
  int mid = t[k].l + t[k].r >> 1;
  build(l, mid, k << 1);
  build(mid + 1, r, k << 1 | 1);
  push_up(k);
}
void update(int l, int r, int val, int k) {
  if (l <= t[k].l && t[k].r <= r) {
    t[k].mx += val;
    t[k].flag += val;
    return;
  }
  push_down(k);
  int mid = t[k].l + t[k].r >> 1;
  if (l <= mid) update(l, r, val, k << 1);
  if (r > mid) update(l, r, val, k << 1 | 1);
  push_up(k);
}
int main() {
  scanf("%d%d%d", &n, &len, &h);
  for (int i = 1; i <= len; i++) scanf("%d", b + i);
  sort(b + 1, b + len + 1);
  build(1, len, 1);
  for (int i = 1; i <= n; i++) {
    scanf("%d", a + i);
    int ll = 1, rr = len, ans = -1;
    while (ll <= rr) {
      int mid = ll + rr >> 1;
      if (b[mid] + a[i] >= h) {
        ans = mid;
        rr = mid - 1;
      } else
        ll = mid + 1;
    }
    L[i] = ans;
  }
  int res = 0;
  for (int i = 1; i <= n; i++) {
    if (L[i] != -1) update(L[i], len, 1, 1);
    if (i >= len) {
      if (t[1].mx >= 0) res++;
      if (L[i - len + 1] != -1) update(L[i - len + 1], len, -1, 1);
    }
  }
  printf("%d\n", res);
  return 0;
}
