#include <bits/stdc++.h>
using namespace std;
const int maxn = 1.5e5 + 10;
int n, m, h, a[maxn], b[maxn], minv[maxn << 2], laz[maxn << 2];
inline void pushdown(int root) {
  if (laz[root]) {
    laz[root << 1] += laz[root];
    laz[root << 1 | 1] += laz[root];
    minv[root << 1] += laz[root];
    minv[root << 1 | 1] += laz[root];
    laz[root] = 0;
  }
}
inline void pushup(int root) {
  minv[root] = min(minv[root << 1], minv[root << 1 | 1]);
}
inline void update(int ul, int ur, int x, int l = 1, int r = m, int root = 1) {
  if (l > ur || r < ul) return;
  if (ul <= l && r <= ur) return laz[root] += x, minv[root] += x, void();
  int mid = l + r >> 1;
  pushdown(root);
  update(ul, ur, x, l, mid, root << 1);
  update(ul, ur, x, mid + 1, r, root << 1 | 1);
  pushup(root);
}
int main() {
  scanf("%d%d%d", &n, &m, &h);
  for (int i = 1; i <= m; i++) {
    scanf("%d", &b[i]);
    update(i, m, -1);
  }
  sort(b + 1, b + m + 1);
  for (int i = 1; i <= n; i++) {
    scanf("%d", &a[i]);
    a[i] = lower_bound(b + 1, b + m + 1, h - a[i]) - b;
    if (i <= m) update(a[i], m, 1);
  }
  int ans = minv[1] >= 0;
  for (int i = m + 1; i <= n; i++) {
    update(a[i], m, 1);
    update(a[i - m], m, -1);
    ans += minv[1] >= 0;
  }
  printf("%d", ans);
  return 0;
}
