Manao is solving a problem with the following statement:

<image>

He came up with a solution that produces the correct answers but is too slow. You are given the pseudocode of his solution, where the function getAnswer calculates the answer to the problem:
    
    
      
    getAnswer(a[1..n], b[1..len], h)  
      answer = 0  
      for i = 1 to n-len+1  
        answer = answer + f(a[i..i+len-1], b, h, 1)  
      return answer  
      
    f(s[1..len], b[1..len], h, index)  
      if index = len+1 then  
        return 1  
      for i = 1 to len  
        if s[index] + b[i] >= h  
          mem = b[i]  
          b[i] = 0  
          res = f(s, b, h, index + 1)  
          b[i] = mem  
          if res > 0  
            return 1  
      return 0  
    

Your task is to help Manao optimize his algorithm.

Input

The first line contains space-separated integers n, len and h (1 ≤ len ≤ n ≤ 150000; 1 ≤ h ≤ 109). The second line contains len space-separated integers b1, b2, ..., blen (1 ≤ bi ≤ 109). The third line contains n space-separated integers a1, a2, ..., an (1 ≤ ai ≤ 109).

Output

Print a single number — the answer to Manao's problem.

Examples

Input

5 2 10
5 3
1 8 5 5 7


Output

2
#include <bits/stdc++.h>
using namespace std;
#pragma comment(linker, "/STACK:255000000")
bool firstout = 1;
template <class T>
T &minn(T &a, T b) {
  if (b < a) a = b;
  return a;
}
template <class T>
T &maxx(T &a, T b) {
  if (a < b) a = b;
  return a;
}
int &madd(int &a, int b) {
  a += b;
  if (a >= 1000000007) a -= 1000000007;
  return a;
}
int &msub(int &a, int b) {
  a -= b;
  if (a < 0) a += 1000000007;
  return a;
}
int &mmult(int &a, int b) { return a = (long long)a * b % 1000000007; }
int mdiv(long long a, long long b, long long m) {
  a = (a % m + m) % m;
  b = (b % m + m) % m;
  if (a % b == 0) return a / b;
  return (a + m * mdiv(-a, m, b)) / b;
}
int n, m, q, nt;
int A[600123], B[600123];
int T[600123], TT[600123];
int L[600123], R[600123];
map<int, int> D;
void add(int i, int l, int r, int t) {
  maxx(l, L[i]);
  minn(r, R[i]);
  if (l > r) return;
  if (l == L[i] && r == R[i]) {
    T[i] += t;
    TT[i] += t;
    return;
  }
  if (TT[i]) {
    T[2 * i] += TT[i];
    TT[2 * i] += TT[i];
    T[2 * i + 1] += TT[i];
    TT[2 * i + 1] += TT[i];
    TT[i] = 0;
  }
  add(2 * i, l, r, t);
  add(2 * i + 1, l, r, t);
  T[i] = max(T[2 * i], T[2 * i + 1]);
}
int main() {
  int i, j, k;
  char c;
  int a, d;
  int ts;
  for (ts = 1; scanf("%"
                     "d",
                     &(n)) > 0;
       ++ts) {
    scanf(
        "%"
        "d",
        &(m));
    scanf(
        "%"
        "d",
        &(q));
    for (i = (0); i < (m); ++i)
      scanf(
          "%"
          "d",
          &(B[i]));
    for (i = (0); i < (n); ++i)
      scanf(
          "%"
          "d",
          &(A[i]));
    sort(B, B + m);
    for (i = (m)-1; i >= (0); --i) D[B[i]] = i;
    nt = m;
    for (; nt & nt - 1; ++nt)
      ;
    for (i = (0); i < (nt); ++i)
      T[nt + i] = TT[nt + i] = 0, L[nt + i] = R[nt + i] = i;
    for (i = (0); i < (m); ++i) T[nt + i] = i - m;
    for (i = (nt)-1; i >= (0); --i)
      T[i] = max(T[2 * i], T[2 * i + 1]), TT[i] = 0, L[i] = L[2 * i],
      R[i] = R[2 * i + 1];
    int g = 0, b = 0;
    map<int, int>::iterator mi;
    for (i = (0); i < (m - 1); ++i) {
      a = q - A[i];
      if (a <= 0)
        ++g;
      else {
        mi = D.lower_bound(a);
        if (mi == D.end())
          ++b;
        else {
          add(1, 0, mi->second, 1);
        }
      }
    }
    int res = 0;
    for (i = (0); i < (n - m + 1); ++i) {
      a = q - A[i + m - 1];
      if (a <= 0)
        ++g;
      else {
        mi = D.lower_bound(a);
        if (mi == D.end())
          ++b;
        else {
          add(1, 0, mi->second, 1);
        }
      }
      if (g || (b == 0 && T[1] <= 0)) ++res;
      a = q - A[i];
      if (a <= 0)
        --g;
      else {
        mi = D.lower_bound(a);
        if (mi == D.end())
          --b;
        else {
          add(1, 0, mi->second, -1);
        }
      }
    }
    printf(
        "%"
        "d",
        (res));
    printf("\n"), firstout = 1;
  }
  return 0;
}
