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
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
#include <bits/stdc++.h>

using namespace std;
typedef long long ll;
#define rep(i, n) for (int i = 0; i < (n); i++)
#define pb push_back
#define st first
#define nd second
pair<int, int> pom[4];
set<pair<int, int>> S;
map<pair<int, int>, int> na_co;
const int MAXP = 2e5 + 7;
int kier[MAXP][4];
bool czy[MAXP];
bool odw[MAXP];
int liczba;

void licz() {
    queue<int> q;
    rep(i, liczba) {
        if (czy[i]) {
            if ((!czy[kier[i][0]]) && (!czy[kier[i][1]])) {
                q.push(i);
            }
            else if ((!czy[kier[i][2]]) && (!czy[kier[i][3]])) {
                q.push(i);
            }
        }
    }
    int ans = 0;
    while (!q.empty()) {
        int v = q.front();
        q.pop();
        if (odw[v]) {
            continue;
        }
        odw[v] = true;
        ans++;
        rep(c, 4) {
            int w = kier[v][c];
            if (!czy[w]) {
                continue;
            }
            if (odw[w]) {
                continue;
            }
            int a1 = kier[w][0];
            int b1 = kier[w][1];
            int a2 = kier[w][2];
            int b2 = kier[w][3];
            if (((!czy[a1]) || odw[a1]) && ((!czy[b1]) || odw[b1])) {
                q.push(w);
            }
            else if (((!czy[a2]) || odw[a2]) && ((!czy[b2]) || odw[b2])) {
                q.push(w);
            }
        }
    }
    cout << ans << '\n';
    rep(i, liczba) {
        odw[i] = false;
    }
}

int main() {
    ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);
    pom[0] = {-1, 0};
    pom[1] = {1, 0};
    pom[2] = {0, -1};
    pom[3] = {0, 1};
    int n, m, k, q;
    cin >> n >> m >> k >> q;
    pair<int, int> T[k];
    int kt = 1;
    rep(i, k) {
        cin >> T[i].st >> T[i].nd;
        if (S.find(T[i]) == S.end()) {
            S.insert(T[i]);
            na_co[T[i]] = kt;
            kt++;
        }
    }
    pair<int, int> zmiany[q];
    rep(i, q) {
        cin >> zmiany[i].st >> zmiany[i].nd;
        if (S.find(zmiany[i]) == S.end()) {
            S.insert(zmiany[i]);
            na_co[zmiany[i]] = kt;
            kt++;
        }
    }
    for (auto p: S) {
        int v = na_co[p];
        rep(i, 4) {
            int x = p.st + pom[i].st;
            int y = p.nd + pom[i].nd;
            if (S.find({x, y}) == S.end()) {
                kier[v][i] = 0;
            }
            else {
                kier[v][i] = na_co[{x, y}];
            }
        }
    }
    rep(i, k) {
        int v = na_co[T[i]];
        czy[v] = true;
        liczba = max(liczba, v + 1);
    }
    licz();
    rep(i, q) {
        int v = na_co[zmiany[i]];
        liczba = max(liczba, v + 1);
        if (czy[v]) {
            czy[v] = false;
        }
        else {
            czy[v] = true;
        }
        licz();
    }
    return 0;
}