#include <iostream>
#include <algorithm>
#include <queue>
using namespace std;
int main() {
task2();
return 0;
}
void task1(){
int n, m;
cin >> n >> m;
vector<vector<int>> adj(n+1);
vector<int> addNodes;
for(int i = 0; i < m; i++) {
int a, b;
cin >> a >> b;
adj[a].push_back(b);
adj[b].push_back(a);
}
bool allfound = false;
vector<bool> visited(n+1, false);
int start = 1;
while(!allfound) {
queue<int> q;
visited[start] = true;
q.push(start);
while (!q.empty()) {
int s = q.front(); q.pop();
for (auto u : adj[s]) {
if (visited[u]) continue;
visited[u] = true;
q.push(u);
}
}
allfound = true;
for(int i = start; i <= n; i++) {
if(!visited[i]) {
addNodes.push_back(i);
allfound = false;
start = i;
break;
}
}
/*for( int i = 1; i <= n; i++) {
cout << i << ": " << visited[i] <<endl;
}*/
}
cout << addNodes.size() << endl;
for(size_t i = 0; i < addNodes.size(); i++) {
cout << addNodes[i] << " " << 1 << endl;
}
return;
}
void task2(){
int n, m,k;
cin >> n >> m >> k;
vector<int> des(n, 0);
vector<int> size(m, 0);
for(int i = 0; i < n; i++) {
cin >> des[i];
}
for(int i = 0; i < m; i++) {
cin >> size[i];
}
sort(des.begin(), des.end());
sort(size.begin(), size.end());
int maxnum = max(n,m);
int pointerM = 0;
int pointerN = 0;
int count = 0;
for(int i = 0; i < maxnum; i++) {
if(des[pointerN] <= size[pointerM] + k && des[pointerN] >= size[pointerM] - k) {
pointerM++;
pointerN++;
++count;
}
else if(des[pointerN] > size[pointerM] + k) {
pointerM++;
}
else if(des[pointerN] < size[pointerM] - k) {
pointerN++;
}
}
cout << count << endl;
return;
}