1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
#include <cstdio>
#include <map>
#include <queue>
#include <utility>
#include <vector>
using namespace std;

#define FOR(i,a,b) for(int i=(a);i<(b);++i)
#define REP(i,n) FOR(i,0,n)
#define VAR(v,w) __typeof(w) v=(w)
#define FORE(it,c) for(VAR(it,(c).begin());it!=(c).end();++it)
#define SIZE(c) ((int)(c).size())
#define MP make_pair
#define FT first
#define SD second
#define INT(x) int x; scanf("%d", &x)

typedef pair<int,int> PII;
typedef vector<bool> VB;

const int DX[4] = {1, 0, -1, 0}, DY[4] = {0, 1, 0, -1};

map<PII, VB> b;

int go() {
	map<PII, VB> c = b;
	queue<PII> q;
	FORE(it,c) if (!it->SD[0] && !it->SD[2] || !it->SD[1] && !it->SD[3])
		q.push(it->FT);
	while (!q.empty()) {
		VAR(it,c.find(q.front()));
		q.pop();
		if (it == c.end()) continue;
		REP(k,4) if (it->SD[k]) {
			VAR(jt,c.find(MP(it->FT.FT + DX[k], it->FT.SD + DY[k])));
			if (jt == c.end()) continue;
			jt->SD[k ^ 2] = 0;
			if (!jt->SD[0] && !jt->SD[2] || !jt->SD[1] && !jt->SD[3]) q.push(jt->FT);
		}
		c.erase(it);
	}
	return SIZE(b) - SIZE(c);
}

int main() {
	INT(n);
	INT(m);
	INT(k);
	INT(q);
	REP(kk,k) {
		INT(x);
		INT(y);
		b[MP(x, y)].resize(4);
	}
	FORE(it,b) REP(k,4) it->SD[k] = b.find(MP(it->FT.FT + DX[k], it->FT.SD + DY[k])) != b.end();
	printf("%d\n", go());
	REP(qq,q) {
		INT(x);
		INT(y);
		VAR(it,b.find(MP(x, y)));
		if (it != b.end()) {
			REP(k,4) if (it->SD[k]) b.find(MP(x + DX[k], y + DY[k]))->SD[k ^ 2] = 0;
			b.erase(it);
		} else {
			VB& d = b[MP(x, y)];
			d.resize(4);
			REP(k,4) {
				VAR(jt,b.find(MP(x + DX[k], y + DY[k])));
				d[k] = jt != b.end();
				if (d[k]) jt->SD[k ^ 2] = 1;
			}
		}
		printf("%d\n", go());
	}
}