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
76
77
78
79
80
81
82
83
84
85
86
87
// MagicDark
#include <bits/stdc++.h>
#define debug cerr << "\33[32m[" << __LINE__ << "]\33[m "
#define SZ(x) ((int) x.size() - 1)
#define all(x) x.begin(), x.end()
#define ms(x, y) memset(x, y, sizeof x)
#define F(i, x, y) for (int i = (x); i <= (y); i++)
#define DF(i, x, y) for (int i = (x); i >= (y); i--)
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
template <typename T> T& chkmax(T& x, T y) {return x = max(x, y);}
template <typename T> T& chkmin(T& x, T y) {return x = min(x, y);}
template <typename T> T& read(T &x) {
	x = 0; int f = 1; char c = getchar();
	for (; !isdigit(c); c = getchar()) if (c == '-') f = -f;
	for (; isdigit(c); c = getchar()) x = (x << 1) + (x << 3) + (c ^ 48);
	return x *= f;
}
int n, m, k, q;
struct custom_hash {
    static uint64_t splitmix64(uint64_t x) {
        x += 0x9e3779b97f4a7c15;
        x = (x ^ (x >> 30)) * 0xbf58476d1ce4e5b9;
        x = (x ^ (x >> 27)) * 0x94d049bb133111eb;
        return x ^ (x >> 31);
    }
    size_t operator()(pair <int, int> x) const {
        static const uint64_t FIXED_RANDOM = chrono::steady_clock::now().time_since_epoch().count();
        return splitmix64(((uint64_t) x.first << 32 | x.second) + FIXED_RANDOM);
    }
};
unordered_set <pair <int, int>, custom_hash> id;
// const int dx[4] = {-1, 1, 0, 0};
// const int dy[4] = {0, 0, -1, 1};
int ans, cur;
void work() {
	int x, y; read(x), read(y);
	F(a, x - 1, x + 1)
		F(b, y - 1, y + 1) {
			if (id.count(make_pair(a, b))) {
				bool flag = false;
				for (int c: {-1, 1}) {
					for (int d: {-1, 1}) {
						if (id.count(make_pair(a + c, b)) && id.count(make_pair(a, b + d)) && id.count(make_pair(a + c, b + d))) {
							flag = true;
							break;
						}
					}
					if (flag) break;
				}
				ans -= flag;
			}
		}
	if (id.count(make_pair(x, y))) id.erase(make_pair(x, y)), cur--;
	else id.insert(make_pair(x, y)), cur++;
	F(a, x - 1, x + 1)
		F(b, y - 1, y + 1) {
			if (id.count(make_pair(a, b))) {
				bool flag = false;
				for (int c: {-1, 1}) {
					for (int d: {-1, 1}) {
						if (id.count(make_pair(a + c, b)) && id.count(make_pair(a, b + d)) && id.count(make_pair(a + c, b + d))) {
							flag = true;
							break;
						}
					}
					if (flag) break;
				}
				ans += flag;
			}
		}
}
signed main() {
	read(n), read(m), read(k), read(q);
	F(i, 1, k) {
		work();
	}
	cout << cur - ans << '\n';
	while (q--) {
		work();
		cout << cur - ans << '\n';
	}
	return 0;
}
/* why?
*/