//In the name of Allah :)
#include <bits/stdc++.h>
using namespace std;
string to_string(char c) { return string(1,c); }
string to_string(bool b) { return b ? "true" : "false"; }
string to_string(const char* s) { return (string)s; }
string to_string(string s) { return s; }
template<class A> string to_string(complex<A> c) { 
	stringstream ss; ss << c; return ss.str(); }
string to_string(vector<bool> v) { 
	string res = "{"; for(int i = 0; i < (int)v.size(); i++) res += char('0'+v[i]);
	res += "}"; return res; }
template<size_t SZ> string to_string(bitset<SZ> b) {
	string res = ""; for(size_t i = 0; i < SZ; i++) res += char('0'+b[i]);
	return res; }
template<class A, class B> string to_string(pair<A,B> p);
template<class T> string to_string(T v) { // containers with begin(), end()
	bool fst = 1; string res = "{";
	for (const auto& x: v) {
		if (!fst) res += ", ";
		fst = 0; res += to_string(x);
	}
	res += "}"; return res;
}
template<class A, class B> string to_string(pair<A,B> p) {
	return "("+to_string(p.first)+", "+to_string(p.second)+")"; }
void DBG() { cerr << "]" << endl; }
template<class H, class... T> void DBG(H h, T... t) {
	cerr << to_string(h); if (sizeof...(t)) cerr << ", ";
	DBG(t...); }
#ifdef LOCAL // compile with -DLOCAL
#define wis(...) cerr << "LINE(" << __LINE__ << ") -> [" << #__VA_ARGS__ << "] : [", DBG(__VA_ARGS__)
#else
#define wis(...) 0
#endif
typedef long long ll;
#define all(x) (x).begin(), (x).end()

const vector<pair<int ,int>> moves = {{1, 0}, {-1, 0}, {0, 1}, {0, -1}};
const int MAXN = 1510;
char grid[MAXN][MAXN];
bitset <MAXN> mark[4][MAXN];
int h, w, n, m;

void dfs(int x, int y, int dir){
	if(mark[dir][x][y]){
		return;
	}
	wis(x, y);
	mark[dir][x][y] = 1;
	grid[x][y] = 'r';
	x = x + moves[dir].first;
	y = y + moves[dir].second;
	if(x >= 0 && y >= 0 && x < h && y < w && grid[x][y] != 'm'){
		dfs(x, y, dir);
	}
}

int main(){
	ios::sync_with_stdio(0);
	cin >> h >> w >> n >> m;
	vector<pair<int, int>> a(n);
	for(int i = 0; i < n; i++){
		int x, y;
		cin >> x >> y;
		x--, y--;
		a[i] = {x, y};
	}
	for(int i = 0; i < m; i++){
		int x, y;
		cin >> x >> y;
		x--, y--;
		grid[x][y] = 'm';
	}
	for(auto [x, y] : a){
		dfs(x, y, 0);
		dfs(x, y, 1);
		dfs(x, y, 2);
		dfs(x, y, 3);
	}
	int ans = 0;
	for(int i = 0; i < h; i++){
		for(int j = 0; j < w; j++){
			ans += grid[i][j] == 'r';
		}
	}
	cout << ans << '\n';
}

#include<bits/stdc++.h>

#define HAS_TEST_CASE 0

namespace rG{

typedef long long ll;

const int N=2e3;

int a[N+10][N+10];
int n,m;
bool can[N+10][N+10];

void main(){
	int T1,T2;
	scanf("%d%d%d%d",&n,&m,&T1,&T2);
	for(int i=1;i<=T1;i++){
		int x,y;scanf("%d%d",&x,&y);
		a[x][y]=1;
	}
	for(int i=1;i<=T2;i++){
		int x,y;scanf("%d%d",&x,&y);
		a[x][y]=2;
	}
	for(int i=1;i<=n;i++){
		bool now=0;
		for(int j=1;j<=m;j++){
			if(a[i][j]==1)can[i][j]|=1,now=1;
			if(a[i][j]==2)now=0;
			if(a[i][j]==0)can[i][j]|=now;
		}
		now=0;
		for(int j=m;j>=1;j--){
			if(a[i][j]==1)can[i][j]|=1,now=1;
			if(a[i][j]==2)now=0;
			if(a[i][j]==0)can[i][j]|=now;
		}
	}
	for(int j=1;j<=m;j++){
		bool now=0;
		for(int i=1;i<=n;i++){
			if(a[i][j]==1)can[i][j]|=1,now=1;
			if(a[i][j]==2)now=0;
			if(a[i][j]==0)can[i][j]|=now;
		}
		now=0;
		for(int i=n;i>=1;i--){
			if(a[i][j]==1)can[i][j]|=1,now=1;
			if(a[i][j]==2)now=0;
			if(a[i][j]==0)can[i][j]|=now;
		}
	}
	int ans=0;
	for(int i=1;i<=n;i++)
		for(int j=1;j<=m;j++)
			ans+=can[i][j];
	printf("%d\n",ans);
}

} // namespace rG

int main(){
#if defined(LOCAL)&&HAS_TEST_CASE
	freopen("tmp.out","w",stdout);
#endif
#if HAS_TEST_CASE
	int T;scanf("%d",&T);
	while(T--)rG::main();
#else
	rG::main();
#endif
	return 0;
}
