#include <algorithm>
#include <vector>
template<typename func>
struct BinarySearch{
func predicate;
std::vector<int> vec;
int n;
BinarySearch(int n, func p): vec(n), predicate(p), n(n){}
int search(int x, int i, int j){ //i=0;j=n-1
while(i<=j){
int mid = i + (j - i) / 2;
if (predicate(vec[mid], x)){
return mid;
} else if (vec[mid] > x) {
j = mid-1;
} else if (vec[mid] < x) {
i = mid+1;
}
}
return -1;
}
};
#include <iostream>
#include <vector>
int main(){
int n, m, k;
std::cin >> n >> m >> k;
auto pred = [&](int mid, int x){
return std::abs(mid - x) <= k;
};
std::vector<int> desired(n);
for (int i = 0; i<n; ++i){
std::cin >> desired[i];
}
BinarySearch bsActual(m, pred);
for (int i = 0; i<m; ++i){
std::cin >> bsActual.vec[i];
}
std::sort(bsActual.vec.begin(), bsActual.vec.end());
std::sort(desired.begin(), desired.end());
int d = 0;
int a = 0;
int numFound = 0;
while(d<n && a<m){
int found = bsActual.search(desired[d], a, m-1);
if (found!=-1) {
a=found+1; ++numFound;
}
++d;
}
std::cout << numFound << "\n";
}