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
#include<bits/stdc++.h>

using namespace std;

map<pair<int, int>, bool> M, Usun;
queue<pair<int, int>> Q;

int rozwiazanie() {
	int x, y;
	for(auto xd:M) {
		x=xd.first.first;
		y=xd.first.second;
		if((M.find({x-1, y})==M.end() && M.find({x+1, y})==M.end()) or (M.find({x, y-1})==M.end() && M.find({x, y+1})==M.end())) {
			Q.push({x, y});
		}	
	}	
	int wyn=0, nx, ny;
	while(!Q.empty()) {
		x=Q.front().first;
		y=Q.front().second;
		Q.pop();
		if(Usun.find({x, y})!=Usun.end()) {
			continue;
		}
		wyn++;
		Usun[{x, y}]=1;
		nx=x-1;
		ny=y;
		if(M.find({nx, ny})!=M.end() && Usun.find({nx, ny})==Usun.end()) {
			if(M.find({nx-1, ny})==M.end() or Usun.find({nx-1, ny})!=Usun.end()) {
				Q.push({nx, ny});
			}	
		}	
		nx=x+1;
		ny=y;
		if(M.find({nx, ny})!=M.end() && Usun.find({nx, ny})==Usun.end()) {
			if(M.find({nx+1, ny})==M.end() or Usun.find({nx+1, ny})!=Usun.end()) {
				Q.push({nx, ny});
			}	
		}
		nx=x;
		ny=y-1;
		if(M.find({nx, ny})!=M.end() && Usun.find({nx, ny})==Usun.end()) {
			if(M.find({nx, ny-1})==M.end() or Usun.find({nx, ny-1})!=Usun.end()) {
				Q.push({nx, ny});
			}	
		}
		nx=x;
		ny=y+1;
		if(M.find({nx, ny})!=M.end() && Usun.find({nx, ny})==Usun.end()) {
			if(M.find({nx, ny+1})==M.end() or Usun.find({nx, ny+1})!=Usun.end()) {
				Q.push({nx, ny});
			}	
		}
	}	
	Usun.clear();
	return wyn;
}	

int main() {
	ios_base::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);
	int n, m, k, q, x, y;
	cin >> n >> m >> k >> q;
	for(int i=1; i<=k; i++) {
		cin >> x >> y;
		M[{x, y}]=1;
	}	
	cout << rozwiazanie() << '\n';
	for(int i=1; i<=q; i++) {
		cin >> x >> y;
		if(M.find({x, y})==M.end()) {
			M[{x, y}]=1;
		}	
		else {
			M.erase({x, y});
		}	
		cout << rozwiazanie() << '\n';
	}	
}