#include <bits/stdc++.h>
using namespace std;
const int maxn = (int)3e5 + 1;
int n, m, h;
int a[maxn], b[maxn];
vector<int> v;
int t[maxn * 4], add[maxn * 4];
void push(int v, int tl, int tr) {
  if (tl != tr) {
    add[v * 2] += add[v];
    add[v * 2 + 1] += add[v];
  }
  t[v] += add[v];
  add[v] = 0;
}
void upd1(int v, int tl, int tr, int p, int q) {
  if (tl == tr) {
    t[v] = q;
  } else {
    int mid = (tl + tr) / 2;
    if (p <= mid) {
      upd1(v * 2, tl, mid, p, q);
    } else {
      upd1(v * 2 + 1, mid + 1, tr, p, q);
    }
    t[v] = max(t[v * 2], t[v * 2 + 1]);
  }
}
void upd(int v, int tl, int tr, int l, int r, int h) {
  push(v, tl, tr);
  if (l > tr || tl > r) {
    return;
  }
  if (l <= tl && tr <= r) {
    add[v] = h;
    push(v, tl, tr);
    return;
  }
  int mid = (tl + tr) / 2;
  upd(v * 2, tl, mid, l, r, h);
  upd(v * 2 + 1, mid + 1, tr, l, r, h);
  t[v] = max(t[v * 2], t[v * 2 + 1]);
}
int ans;
int main() {
  cin >> n >> m >> h;
  for (int i = 1; i <= m; i++) {
    cin >> a[i];
    v.push_back(h - a[i]);
  }
  for (int i = 1; i <= n; i++) {
    cin >> b[i];
    v.push_back(b[i]);
  }
  sort(v.begin(), v.end());
  v.resize(unique(v.begin(), v.end()) - v.begin());
  for (int i = 1; i <= n; i++) {
    b[i] = lower_bound(v.begin(), v.end(), b[i]) - v.begin() + 1;
  }
  for (int i = 1; i <= m; i++) {
    a[i] = lower_bound(v.begin(), v.end(), h - a[i]) - v.begin() + 1;
  }
  sort(a + 1, a + m + 1);
  reverse(a + 1, a + m + 1);
  for (int i = 1; i <= m; i++) {
    upd1(1, 1, 300000, a[i], i);
  }
  for (int i = 1; i <= m; i++) {
    upd(1, 1, 300000, 1, b[i], -1);
  }
  if (t[1] < 1) {
    ans++;
  }
  for (int i = m + 1; i <= n; i++) {
    upd(1, 1, 300000, 1, b[i - m], 1);
    upd(1, 1, 300000, 1, b[i], -1);
    if (t[1] < 1) {
      ans++;
    }
  }
  cout << ans;
}
