#include <bits/stdc++.h>
#define int long long
#define min(x,y) (((x)<(y))?(x):(y))
#define max(x,y) (((x)>(y))?(x):(y))
#define lowbit(x) ((x)&-(x))
#define abs(x) (((x)<(0))?(-(x)):(x))
#define swap(a,b) a^=b^=a^=b
#define INF 1e18
#define MAXN 1000005
using namespace std;
int n, m, d, lstb[MAXN], cnt[MAXN], lflag[MAXN], alflag[MAXN], ans, lpointer[MAXN], rpointer[MAXN];
pair<int, int> a[MAXN], b[MAXN];
vector<int> by[MAXN];
unordered_set<int> blst[MAXN];
int getdis(int l, int r)
{
if (l <= r)
{
return r - l + 1;
}
return r + d - l + 1;
}
void printpointer()
{
cout << "l: ";
for (int i = 1; i <= d; i++)
{
cout << lpointer[i] << " ";
}
cout << endl;
cout << "r: ";
for (int i = 1; i <= d; i++)
{
cout << rpointer[i] << " ";
}
cout << endl;
}
signed main()
{
cin >> n >> m >> d;
for (int i = 1; i <= n; i++)
{
cin >> a[i].first >> a[i].second;
if (a[i].first == 0)
{
a[i].first = d;
}
if (a[i].second == 0)
{
a[i].second = d;
}
cnt[a[i].first]++;
lflag[a[i].second] = 1;
alflag[a[i].second] = 1;
}
for (int i = 1; i <= m; i++)
{
cin >> b[i].first >> b[i].second;
if (b[i].first == 0)
{
b[i].first = d;
}
if (b[i].second == 0)
{
b[i].second = d;
}
lflag[b[i].second] = 1;
by[b[i].first].push_back(b[i].second);
}
sort(a + 1, a + n + 1);
sort(b + 1, b + m + 1);
for (int i = 1; i <= m; i++)
{
lstb[b[i].second] = b[i].first;
}
for (int i = 1; i <= d; i++)
{
if (lstb[i])
{
blst[lstb[i]].insert(i);
}
}
ans = d * d;
for (int i = 1; i <= d; i++)
{
int lst = 0;
for (int j = 1; j <= d; j++)
{
if (lflag[j])
{
lst = j;
}
}
int maxd = 0, CNT = 0;
for (int j = 1; j <= d; j++)
{
if (lflag[j])
{
maxd = max(maxd, getdis(lst, j) - 2);
if (getdis(lst, j) - 2 == -1)
{
maxd = max(maxd, d - 1);
}
rpointer[lst] = j;
lpointer[j] = lst;
lst = j;
}
}
for (int j = i, flag = 0; flag < d; flag++, j = j % d + 1)
{
for (int k : blst[j])
{
if (alflag[k])
{
continue;
}
maxd = max(maxd, getdis(lpointer[k], rpointer[k]) - 2);
rpointer[lpointer[k]] = lpointer[k];
lpointer[rpointer[k]] = rpointer[k];
lpointer[k] = rpointer[k] = 0;
}
CNT += cnt[j];
if (CNT == n)
{
ans = min(ans, getdis(i, j) * (d - maxd));
}
}
for (int j : by[i])
{
blst[lstb[j]].erase(j);
lstb[j] = i;
blst[i].insert(j);
}
}
cout << ans;
return 0;
}