#include <bits/stdc++.h>
using namespace std;
const int N = 150010;
int m, n, h;
int a[N], b[N];
struct node {
  int l, r, lazy, v;
} tree[N << 2];
inline void pushup(int x) {
  tree[x].v = min(tree[x << 1].v, tree[x << 1 | 1].v);
}
void build(int l, int r, int x) {
  tree[x].l = l;
  tree[x].r = r;
  if (l == r) {
    tree[x].v = n - l;
    return;
  }
  int mid = (l + r) >> 1;
  build(l, mid, x << 1);
  build(mid + 1, r, x << 1 | 1);
  pushup(x);
}
inline void pushdown(int x) {
  if (tree[x].lazy && tree[x].l != tree[x].r) {
    tree[x << 1].v += tree[x].lazy;
    tree[x << 1].lazy += tree[x].lazy;
    tree[x << 1 | 1].v += tree[x].lazy;
    tree[x << 1 | 1].lazy += tree[x].lazy;
  }
  tree[x].lazy = 0;
}
void updata(int l, int r, int v, int x) {
  if (l == tree[x].l && tree[x].r == r) {
    tree[x].lazy += v;
    tree[x].v += v;
    return;
  }
  pushdown(x);
  int ls = x << 1, rs = ls | 1, mid = (tree[x].l + tree[x].r) >> 1;
  if (l > mid)
    updata(l, r, v, rs);
  else if (r <= mid)
    updata(l, r, v, ls);
  else
    updata(l, mid, v, ls), updata(mid + 1, r, v, rs);
  pushup(x);
}
int main() {
  ios::sync_with_stdio(0);
  cin.tie(0);
  cin >> m >> n >> h;
  for (int i = 1; i <= n; i++) cin >> b[i];
  for (int i = 1; i <= m; i++) cin >> a[i];
  build(1, n, 1);
  sort(b + 1, b + 1 + n);
  int ans = 0;
  for (int i = 1; i <= m; i++) {
    int l = lower_bound(b + 1, b + 1 + n, h - a[i]) - b;
    if (l <= n) updata(l, n, 1, 1);
    if (i > n) {
      l = lower_bound(b + 1, b + 1 + n, h - a[i - n]) - b;
      if (l <= n) updata(l, n, -1, 1);
    }
    if (tree[1].v >= n) ++ans;
  }
  cout << ans << endl;
  return 0;
}
